[delta]: Enable ag5648, et-6248brb, ag9064 and fix the build error of ag5648 PSU module. (#32)

* 1. Fixed delta ag5648 PSU modules.
2. Enable build ag5648.

Signed-off-by: neal tai <neal.tai@deltaww.com>

* 1. Modified the kernel depends for ag5648.
2. Modified platform-modules-ag5648.service for install ag5648.

Signed-off-by: neal tai <neal.tai@deltaww.com>

* Enable the ag9064.

Signed-off-by: Stanley Chi <stanley.chi@deltaww.com>

* Add Delta platform et-6248brb

Signed-off-by: neal tai <neal.tai@deltaww.com>
This commit is contained in:
StanleyCi 2018-05-02 17:46:02 +08:00 committed by Guohan Lu
parent 0f0e7ab7e8
commit 145aa4ff70
27 changed files with 3279 additions and 3 deletions

View File

@ -0,0 +1,51 @@
# name lanes alias index
Ethernet0 1 1000 0
Ethernet1 2 1000 1
Ethernet2 3 1000 2
Ethernet3 4 1000 3
Ethernet4 5 1000 4
Ethernet5 6 1000 5
Ethernet6 7 1000 6
Ethernet7 8 1000 7
Ethernet8 9 1000 8
Ethernet9 10 1000 9
Ethernet10 11 1000 10
Ethernet11 12 1000 11
Ethernet12 13 1000 12
Ethernet13 14 1000 13
Ethernet14 15 1000 14
Ethernet15 16 1000 15
Ethernet16 17 1000 16
Ethernet17 18 1000 17
Ethernet18 19 1000 18
Ethernet19 20 1000 19
Ethernet20 21 1000 20
Ethernet21 22 1000 21
Ethernet22 23 1000 22
Ethernet23 24 1000 23
Ethernet24 25 1000 24
Ethernet25 26 1000 25
Ethernet26 27 1000 26
Ethernet27 28 1000 27
Ethernet28 29 1000 28
Ethernet29 30 1000 29
Ethernet30 31 1000 30
Ethernet31 32 1000 31
Ethernet32 33 1000 32
Ethernet33 34 1000 33
Ethernet34 35 1000 34
Ethernet35 36 1000 35
Ethernet36 37 1000 36
Ethernet37 38 1000 37
Ethernet38 39 1000 38
Ethernet39 40 1000 39
Ethernet40 41 1000 40
Ethernet41 42 1000 41
Ethernet42 43 1000 42
Ethernet43 44 1000 43
Ethernet44 45 1000 44
Ethernet45 46 1000 45
Ethernet46 47 1000 46
Ethernet47 48 1000 47
Ethernet48 54 10000 48
Ethernet49 53 10000 49

View File

@ -0,0 +1 @@
SAI_INIT_CONFIG_FILE=/etc/bcm/helix4-et-6248brb-48x1G+2x10G.config.bcm

View File

@ -0,0 +1,12 @@
INTERVAL=10
DEVPATH=hwmon1=/sys/bus/i2c/devices
DEVNAME=hwmon1=adt7473
FCTEMPS=hwmon1/0-0048/hwmon/hwmon*/temp1_input hwmon1/7-0049/hwmon/hwmon*/temp1_input hwmon1/8-004a/hwmon/hwmon*/temp1_input
FCFANS=hwmon1/0-002e/fan1_input hwmon1/0-002e/fan2_input
FCTARGETS=hwmon1/0-002e/pwm1 hwmon1/0-002e/pwm2
MINTEMP=20
MAXTEMP=60
MINSTART=75
MINSTOP=22

View File

@ -0,0 +1,279 @@
#!/bin/bash
#
# Simple script implementing a temperature dependent fan speed control
# Supported Linux kernel versions: 2.6.5 and later
#
# Version 0.70
#
# Usage: fancontrol [CONFIGFILE]
#
# Dependencies:
# bash, egrep, sed, cut, sleep, readlink, lm_sensors :)
#
# Please send any questions, comments or success stories to
# marius.reiner@hdev.de
# Thanks!
#
# For configuration instructions and warnings please see fancontrol.txt, which
# can be found in the doc/ directory or at the website mentioned above.
#
#
# Copyright 2003 Marius Reiner <marius.reiner@hdev.de>
# Copyright (C) 2007-2009 Jean Delvare <khali@linux-fr.org>
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
#
PIDFILE="/var/run/fancontrol.pid"
#DEBUG=1
MAX=255
function LoadConfig
{
local fcvcount fcv
echo "Loading configuration from $1 ..."
if [ ! -r "$1" ]
then
echo "Error: Can't read configuration file" >&2
exit 1
fi
# grep configuration from file
INTERVAL=`egrep '^INTERVAL=.*$' $1 | sed -e 's/INTERVAL=//g'`
DEVPATH=`egrep '^DEVPATH=.*$' $1 | sed -e 's/DEVPATH= *//g'`
DEVNAME=`egrep '^DEVNAME=.*$' $1 | sed -e 's/DEVNAME= *//g'`
FCTEMPS=`egrep '^FCTEMPS=.*$' $1 | sed -e 's/FCTEMPS=//g'`
MINTEMP=`egrep '^MINTEMP=.*$' $1 | sed -e 's/MINTEMP=//g'`
MAXTEMP=`egrep '^MAXTEMP=.*$' $1 | sed -e 's/MAXTEMP=//g'`
MINSTART=`egrep '^MINSTART=.*$' $1 | sed -e 's/MINSTART=//g'`
MINSTOP=`egrep '^MINSTOP=.*$' $1 | sed -e 's/MINSTOP=//g'`
HWMON=$( echo "$DEVPATH" | sed 's/=.*$//g')
FCDEVPATH=$( echo "$DEVPATH" | sed 's/^.*=//g')
FCMINTEMP=$MINTEMP
FCMAXTEMP=$MAXTEMP
FCMINSTART=$MINSTART
FCMINSTOP=$MINSTOP
AFCTEMP_1_LOWER=(00 39 36 41 46 55)
AFCTEMP_1_UPPER=(39 39 44 49 54 150)
AFCTEMP_2_LOWER=(00 61 65 69 73 82)
AFCTEMP_2_UPPER=(63 67 71 75 79 150)
AFCTEMP_3_LOWER=(00 51 55 59 63 71)
AFCTEMP_3_UPPER=(53 57 61 65 69 150)
FCFANS=`egrep '^FCFANS=.*$' $1 | sed -e 's/FCFANS=//g'`
FCTARGETS=`egrep '^FCTARGETS=.*$' $1 | sed -e 's/FCTARGETS=//g'`
# Check whether all mandatory settings are set
if [[ -z ${INTERVAL} || -z ${FCTEMPS} || -z ${MINTEMP} || -z ${MAXTEMP} || -z ${MINSTART} || -z ${MINSTOP} ]]
then
echo "Some mandatory settings missing, please check your config file!" >&2
exit 1
fi
if [ "$INTERVAL" -le 0 ]
then
echo "Error in configuration file:" >&2
echo "INTERVAL must be at least 1" >&2
exit 1
fi
# write settings to arrays for easier use and print them
echo
echo "Common settings:"
temp_string=$FCTEMPS
let fcvcount=0
for fcv in $FCTEMPS
do
fcvcount=$((fcvcount+1))
AFCTEMP[$fcvcount]=$( echo "$temp_string" | cut -d" " -f $fcvcount )
AFCTEMP[$fcvcount]=$( echo "${AFCTEMP[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' )
AFCTEMP_PATH[$fcvcount]=$( echo "${AFCTEMP[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' )
AFCTEMP[$fcvcount]=$( cat ${AFCTEMP[$fcvcount]} )
AFCTEMP[$fcvcount]=$(( AFCTEMP[$fcvcount]/1000 ))
done
fan_string=$FCFANS
fcvcount=0
for fcv in $FCFANS
do
fcvcount=$((fcvcount+1))
AFCFAN[$fcvcount]=$( echo "$fan_string" | cut -d" " -f $fcvcount )
AFCFAN_PATH[$fcvcount]=$( echo "${AFCFAN[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' )
AFCFAN[$fcvcount]=$( cat ${AFCFAN_PATH[$fcvcount]} )
done
target_string=$FCTARGETS
fcvcount=0
for fcv in $FCTARGETS
do
fcvcount=$((fcvcount+1))
AFCTARGET[$fcvcount]=$( echo "$target_string" | cut -d" " -f $fcvcount )
AFCFAN_TARGET[$fcvcount]=$( echo "${AFCTARGET[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' )
done
}
# Check that all referenced sysfs files exist
function CheckFiles
{
local outdated=0 fcvcount tsen fan
if [ $outdated -eq 1 ]
then
echo >&2
echo "At least one referenced file is missing. Either some required kernel" >&2
echo "modules haven't been loaded, or your configuration file is outdated." >&2
echo "In the latter case, you should run pwmconfig again." >&2
fi
return $outdated
}
LoadConfig $1
# Detect path to sensors
if [ ! -d $DIR ]
then
echo $0: 'No sensors found! (did you load the necessary modules?)' >&2
exit 1
fi
cd $DIR
# Check for configuration change
if [ "$DIR" != "/" ] && [ -z "$DEVPATH" -o -z "$DEVNAME" ]
then
echo "Configuration is too old, please run pwmconfig again" >&2
exit 1
fi
if [ "$DIR" = "/" -a -n "$DEVPATH" ]
then
echo "Unneeded DEVPATH with absolute device paths" >&2
exit 1
fi
CheckFiles || exit 1
if [ -f "$PIDFILE" ]
then
echo "File $PIDFILE exists, is fancontrol already running?" >&2
exit 1
fi
echo $$ > "$PIDFILE"
# main function
function UpdateThermalSensors
{
fcvcount=0
for fcv in $FCTEMPS
do
fcvcount=$((fcvcount+1))
AFCTEMP[$fcvcount]=$( cat ${AFCTEMP_PATH[$fcvcount]} )
AFCTEMP[$fcvcount]=$(( AFCTEMP[$fcvcount]/1000 ))
done
}
function UpdateThermalLevel
{
AFCTEMP_NUM=$((6-${AFCTEMP_LEVEL[$i]}))
AFCTEMP_UPPER_BUF=AFCTEMP_"$i"_UPPER["$AFCTEMP_NUM"]
AFCTEMP_LOWER_BUF=AFCTEMP_"$i"_LOWER["$AFCTEMP_NUM"]
AFCTEMP_UPPER=${!AFCTEMP_UPPER_BUF}
AFCTEMP_LOWER=${!AFCTEMP_LOWER_BUF}
if (( ("${AFCTEMP[$i]}" <= "$AFCTEMP_UPPER") && ("${AFCTEMP[$i]}" >= "$AFCTEMP_LOWER") )) ; then
FLAG=2
elif (( "${AFCTEMP[$i]}" > "$AFCTEMP_UPPER" )); then
AFCTEMP_LEVEL[$i]=$((${AFCTEMP_LEVEL[$i]} - 1))
FLAG=1
elif (( "${AFCTEMP[$i]}" < "$AFCTEMP_LOWER" )); then
AFCTEMP_LEVEL[$i]=$((${AFCTEMP_LEVEL[$i]} + 1))
FLAG=1
else
AFCTEMP_LEVEL[$i]=1
FLAG=2
fi
}
function UpdateFanSpeeds
{
#echo "num tmp lev F L H"
#Update level
for i in 1 2 3
do
#echo "----------------------"
FLAG=0
#FLAG=0 : initial flag
#FLAG=1 : update level
#FLAG=2 : final level
while [ $FLAG -ne 2 ]
do
UpdateThermalLevel
#echo " $i ${AFCTEMP[$i]} ${AFCTEMP_LEVEL[$i]} $FLAG $AFCTEMP_LOWER $AFCTEMP_UPPER "
done
done
min=${AFCTEMP_LEVEL[0]}
for j in "${AFCTEMP_LEVEL[@]}"; do
(( j < min )) && min=$j
done
if (($min == 1 || $min == 2)); then
FAN_PERCENTAGE=100
elif (($min == 3)); then
FAN_PERCENTAGE=80
elif (($min == 4)); then
FAN_PERCENTAGE=60
elif (($min == 5)); then
FAN_PERCENTAGE=40
elif (($min == 6)); then
FAN_PERCENTAGE=30
else
FAN_PERCENTAGE=100
fi
echo "The lowest level of thermal sensors: $min "
echo "Trying to set fan speed to $FAN_PERCENTAGE %"
#Set speed to fan1~fan10
FAN_PERCENTAGE=`expr $FAN_PERCENTAGE \* 255 / 100`
let fcvcount=0
for fcv in $FCFANS
do
fcvcount=$(( fcvcount + 1 ))
echo $FAN_PERCENTAGE > ${AFCFAN_TARGET[$fcvcount]}
AFCFAN[$fcvcount]=$( cat ${AFCFAN_PATH[$fcvcount]} )
echo "FAN fan$fcvcount = ${AFCFAN[$fcvcount]} (rpm)"
done
rm -f "$PIDFILE"
}
# main loop calling the main function at specified intervals
AFCTEMP_LEVEL=(9 4 4 4) #inttial level
while true
do
UpdateThermalSensors
UpdateFanSpeeds
echo "Sleep $INTERVAL seconds ..."
echo
# Sleep while still handling signals
sleep $INTERVAL &
wait $!
done

View File

@ -0,0 +1,3 @@
CONSOLE_PORT=0x2f8
CONSOLE_DEV=1
CONSOLE_SPEED=115200

View File

@ -0,0 +1,46 @@
#ET_6248BRB Port_Remap
# Vlan set and port enable
clear c
port ge en=1
port hg en=1
# led0 port order remap
m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=0 REMAP_PORT_1=1 REMAP_PORT_2=2 REMAP_PORT_3=3
m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=4 REMAP_PORT_5=5 REMAP_PORT_6=6 REMAP_PORT_7=7
m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=51 REMAP_PORT_9=50 REMAP_PORT_10=49 REMAP_PORT_11=48
m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=47 REMAP_PORT_13=46 REMAP_PORT_14=45 REMAP_PORT_15=44
m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=43 REMAP_PORT_17=42 REMAP_PORT_18=41 REMAP_PORT_19=40
m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=39 REMAP_PORT_21=38 REMAP_PORT_22=37 REMAP_PORT_23=36
m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=35 REMAP_PORT_25=34 REMAP_PORT_26=33 REMAP_PORT_27=32
m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=31 REMAP_PORT_29=30 REMAP_PORT_30=29 REMAP_PORT_31=28
m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=27 REMAP_PORT_33=26 REMAP_PORT_34=25 REMAP_PORT_35=24
m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 REMAP_PORT_37=22 REMAP_PORT_38=21 REMAP_PORT_39=20
m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=19 REMAP_PORT_41=18 REMAP_PORT_42=17 REMAP_PORT_43=16
m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=15 REMAP_PORT_45=14 REMAP_PORT_46=13 REMAP_PORT_47=12
m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=11 REMAP_PORT_49=10 REMAP_PORT_50=9 REMAP_PORT_51=8
m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=7 REMAP_PORT_53=6 REMAP_PORT_54=5 REMAP_PORT_55=4
m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=3 REMAP_PORT_57=2 REMAP_PORT_58=1 REMAP_PORT_59=0
m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=60 REMAP_PORT_61=61 REMAP_PORT_62=62 REMAP_PORT_63=63
echo "ET_6248BRB LED Port Remap: Done."
#ET_6248BRB_LED
#--------------------------------------------------------------------------------------------------
#LED Auto link/up
led stop
led prog '\
02 00 60 E0 02 A0 60 E2 86 E6 02 00 60 E1 06 E0\
D2 30 75 28 02 00 2E E0 32 08 97 71 1F 77 44 2E\
E0 32 04 97 71 3C 77 40 02 00 2E E0 32 08 97 71\
33 77 44 2E E0 32 03 97 71 3C 77 40 02 02 77 44\
02 04 77 44 60 E3 2E E0 32 00 32 01 B7 97 02 00\
0E 00 12 E4 FE E1 50 12 E4 05 60 E5 12 E3 05 0A\
02 71 67 67 9A 77 69 67 86 12 E3 05 0A 01 71 74\
67 9A 77 76 67 86 06 E2 F2 01 60 E2 86 E0 06 E0\
D2 34 74 0A 3A 68 06 E5 D2 00 70 96 16 E6 99 99\
1A 00 71 96 77 9A 32 0F 87 57 32 0E 87 57 00 00\
'
led auto on
led start

View File

@ -0,0 +1,766 @@
<DeviceMiniGraph xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="Microsoft.Search.Autopilot.Evolution">
<CpgDec>
<IsisRouters xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
<PeeringSessions>
<BGPSession>
<StartRouter>ARISTA01T1</StartRouter>
<StartPeer>10.0.0.1</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>10.0.0.0</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA02T1</StartRouter>
<StartPeer>10.0.0.5</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>10.0.0.4</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA03T1</StartRouter>
<StartPeer>10.0.0.9</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>10.0.0.8</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA04T1</StartRouter>
<StartPeer>10.0.0.13</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>10.0.0.12</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA01T1</StartRouter>
<StartPeer>FC00::2</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>FC00::1</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA02T1</StartRouter>
<StartPeer>FC00::A</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>FC00::9</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA03T1</StartRouter>
<StartPeer>FC00::12</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>FC00::11</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
<BGPSession>
<StartRouter>ARISTA04T1</StartRouter>
<StartPeer>FC00::1A</StartPeer>
<EndRouter>sonic</EndRouter>
<EndPeer>FC00::19</EndPeer>
<Multihop>1</Multihop>
<HoldTime>180</HoldTime>
<KeepAliveTime>60</KeepAliveTime>
</BGPSession>
</PeeringSessions>
<Routers xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
<a:BGPRouterDeclaration>
<a:ASN>64601</a:ASN>
<a:Hostname>sonic</a:Hostname>
<a:Peers>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>10.0.0.1</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>10.0.0.5</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>10.0.0.9</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>10.0.0.13</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>FC00::2</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>FC00::A</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>FC00::12</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
<BGPPeer>
<ElementType>BGPPeer</ElementType>
<Address>FC00::1A</Address>
<RouteMapIn i:nil="true"/>
<RouteMapOut i:nil="true"/>
<Vrf i:nil="true"/>
</BGPPeer>
</a:Peers>
<a:RouteMaps/>
</a:BGPRouterDeclaration>
<a:BGPRouterDeclaration>
<a:ASN>64802</a:ASN>
<a:Hostname>ARISTA01T1</a:Hostname>
<a:RouteMaps/>
</a:BGPRouterDeclaration>
<a:BGPRouterDeclaration>
<a:ASN>64802</a:ASN>
<a:Hostname>ARISTA02T1</a:Hostname>
<a:RouteMaps/>
</a:BGPRouterDeclaration>
<a:BGPRouterDeclaration>
<a:ASN>64802</a:ASN>
<a:Hostname>ARISTA03T1</a:Hostname>
<a:RouteMaps/>
</a:BGPRouterDeclaration>
<a:BGPRouterDeclaration>
<a:ASN>64802</a:ASN>
<a:Hostname>ARISTA04T1</a:Hostname>
<a:RouteMaps/>
</a:BGPRouterDeclaration>
</Routers>
</CpgDec>
<DpgDec>
<DeviceDataPlaneInfo>
<IPSecTunnels/>
<LoopbackIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
<a:LoopbackIPInterface>
<Name>HostIP</Name>
<AttachTo>Loopback0</AttachTo>
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.Evolution">
<b:IPPrefix>10.1.0.32/32</b:IPPrefix>
</a:Prefix>
<a:PrefixStr>10.1.0.32/32</a:PrefixStr>
</a:LoopbackIPInterface>
<a:LoopbackIPInterface>
<Name>HostIP1</Name>
<AttachTo>Loopback0</AttachTo>
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.Evolution">
<b:IPPrefix>FC00:1::32/128</b:IPPrefix>
</a:Prefix>
<a:PrefixStr>FC00:1::32/128</a:PrefixStr>
</a:LoopbackIPInterface>
</LoopbackIPInterfaces>
<ManagementIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
<a:ManagementIPInterface>
<Name>HostIP</Name>
<AttachTo>eth0</AttachTo>
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.Evolution">
<b:IPPrefix>10.251.0.243/23</b:IPPrefix>
</a:Prefix>
<a:PrefixStr>10.251.0.243/23</a:PrefixStr>
</a:ManagementIPInterface>
</ManagementIPInterfaces>
<MplsInterfaces/>
<MplsTeInterfaces/>
<RsvpInterfaces/>
<Hostname>sonic</Hostname>
<PortChannelInterfaces/>
<VlanInterfaces>
<VlanInterface>
<ElementType>VlanInterface</ElementType>
<Name>Vlan2</Name>
<AttachTo>Ethernet0;Ethernet1;Ethernet2;Ethernet3;Ethernet4;Ethernet5;Ethernet6;Ethernet7;Ethernet8;Ethernet9;Ethernet10;Ethernet11;Ethernet12;Ethernet13;Ethernet14;Ethernet15;Ethernet16;Ethernet17;Ethernet18;Ethernet19;Ethernet20;Ethernet21;Ethernet22;Ethernet23;Ethernet24;Ethernet25;Ethernet26;Ethernet27;Ethernet28;Ethernet29;Ethernet30;Ethernet31;Ethernet32;Ethernet33;Ethernet34;Ethernet35;Ethernet36;Ethernet37;Ethernet38;Ethernet39;Ethernet40;Ethernet41;Ethernet42;Ethernet43;Ethernet44;Ethernet45;Ethernet46;Ethernet47</AttachTo>
<NoDhcpRelay>False</NoDhcpRelay>
<StaticDHCPRelay>0.0.0.0/0</StaticDHCPRelay>
<Type i:nil="true"/>
<VlanID>2</VlanID>
<Tag>2</Tag>
<Subnets>172.0.0.0/26</Subnets>
</VlanInterface>
</VlanInterfaces>
<IPInterfaces>
<IPInterface>
<ElementType>IPInterface</ElementType>
<Name i:Name="true"/>
<AttachTo>Ethernet48</AttachTo>
<Prefix>10.0.0.0/31</Prefix>
</IPInterface>
<IPInterface>
<ElementType>IPInterface</ElementType>
<Name i:Name="true"/>
<AttachTo>Ethernet49</AttachTo>
<Prefix>10.0.0.4/31</Prefix>
</IPInterface>
<IPInterface>
<ElementType>IPInterface</ElementType>
<Name i:Name="true"/>
<AttachTo>Ethernet48</AttachTo>
<Prefix>FC00::1/126</Prefix>
</IPInterface>
<IPInterface>
<ElementType>IPInterface</ElementType>
<Name i:Name="true"/>
<AttachTo>Ethernet49</AttachTo>
<Prefix>FC00::9/126</Prefix>
</IPInterface>
<IPInterface>
<ElementType>IPInterface</ElementType>
<Name i:nil="true"/>
<AttachTo>Vlan2</AttachTo>
<Prefix>172.0.0.1/26</Prefix>
</IPInterface>
</IPInterfaces>
<DataAcls/>
<AclInterfaces/>
<DownstreamSummaries/>
<DownstreamSummarySet xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
</DeviceDataPlaneInfo>
</DpgDec>
<PngDec>
<DeviceInterfaceLinks>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>10000</Bandwidth>
<EndDevice>ARISTA01T1</EndDevice>
<EndPort>Ethernet1</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>sonic</StartDevice>
<StartPort>Ethernet48</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>10000</Bandwidth>
<EndDevice>ARISTA02T1</EndDevice>
<EndPort>Ethernet1</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>sonic</StartDevice>
<StartPort>Ethernet49</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet0</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-01</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet1</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-02</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet2</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-03</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet3</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-04</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet4</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-05</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet5</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-06</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet6</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-07</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet7</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-08</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet8</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-09</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet9</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-10</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet10</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-11</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet11</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-12</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet12</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-13</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet13</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-14</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet14</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-15</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet15</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-16</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet16</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-17</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet17</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-18</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet18</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-19</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet19</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-20</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet20</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-21</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet21</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-22</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet22</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-23</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet23</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-24</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet24</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-25</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet25</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-26</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet26</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-27</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet27</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-28</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet28</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-29</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet29</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-30</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet30</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-31</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet31</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-32</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet32</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-33</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet33</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-34</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet34</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-35</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet35</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-36</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet36</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-37</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet37</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-38</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet38</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-39</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet39</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-40</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet40</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-41</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet41</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-42</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet42</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-43</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet43</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-44</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet44</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-45</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet45</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-46</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet46</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-47</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
<DeviceLinkBase i:type="DeviceInterfaceLink">
<ElementType>DeviceInterfaceLink</ElementType>
<AutoNegotiation>true</AutoNegotiation>
<Bandwidth>1000</Bandwidth>
<EndDevice>sonic</EndDevice>
<EndPort>Ethernet47</EndPort>
<FlowControl>true</FlowControl>
<StartDevice>server-48</StartDevice>
<StartPort>0</StartPort>
</DeviceLinkBase>
</DeviceInterfaceLinks>
<Devices>
<Device i:type="ToRRouter">
<Hostname>sonic</Hostname>
<HwSku>Delta-et-6248brb</HwSku>
<ManagementAddress xmlns:a="Microsoft.Search.Autopilot.NetMux">
<a:IPPrefix>10.251.0.243</a:IPPrefix>
</ManagementAddress>
</Device>
</Devices>
</PngDec>
<Hostname>sonic</Hostname>
<HwSku>Delta-et-6248brb</HwSku>
</DeviceMiniGraph>

View File

@ -0,0 +1,32 @@
#!/usr/bin/env python
#############################################################################
# Mellanox
#
# Platform and model specific eeprom subclass, inherits from the base class,
# and provides the followings:
# - the eeprom format definition
# - specific encoder/decoder if there is special need
#############################################################################
try:
import exceptions
import binascii
import time
import optparse
import warnings
import os
import sys
from sonic_eeprom import eeprom_base
from sonic_eeprom import eeprom_tlvinfo
import subprocess
except ImportError, e:
raise ImportError (str(e) + "- required module not found")
class board(eeprom_tlvinfo.TlvInfoDecoder):
_TLV_INFO_MAX_LEN = 256
def __init__(self, name, path, cpld_root, ro):
self.eeprom_path = "/sys/devices/pci0000:00/0000:00:13.0/i2c-1/1-0054/eeprom"
super(board, self).__init__(self.eeprom_path, 0, '', True)

View File

@ -0,0 +1,55 @@
import os.path
try:
from sonic_psu.psu_base import PsuBase
except ImportError as e:
raise ImportError (str(e) + "- required module not found")
class PsuUtil(PsuBase):
"""Platform-specific PSUutil class"""
def __init__(self):
PsuBase.__init__(self)
self.psu_path = "/sys/devices/platform/delta-et6248brb-gpio.0/PSU/psu{}_pg"
self.psu_oper_status = "in1_input"
self.psu_presence = "/sys/devices/platform/delta-et6248brb-gpio.0/PSU/psu{}_pres"
def get_num_psus(self):
"""
Retrieves the number of PSUs available on the device
:return: An integer, the number of PSUs available on the device
"""
return 2
def get_psu_status(self, index):
if index is None:
return False
try:
reg_file = open(self.psu_path.format(index))
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
if int(reg_file.readline()) == 1:
return True
return False
def get_psu_presence(self, index):
if index is None:
return False
try:
reg_file = open(self.psu_presence.format(index))
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
if int(reg_file.readline()) == 0:
return True
return False

View File

@ -0,0 +1,88 @@
# sfputil.py
#
# Platform-specific SFP transceiver interface for SONiC
#
try:
import time
from sonic_sfp.sfputilbase import SfpUtilBase
except ImportError as e:
raise ImportError("%s - required module not found" % str(e))
class SfpUtil(SfpUtilBase):
"""Platform-specific SfpUtil class"""
PORT_START = 48
PORT_END = 49
PORTS_IN_BLOCK = 1
EEPROM_OFFSET = 44
_port_to_eeprom_mapping = {}
@property
def port_start(self):
return self.PORT_START
@property
def port_end(self):
return self.PORT_END
@property
def qsfp_ports(self):
return range(0)
@property
def port_to_eeprom_mapping(self):
return self._port_to_eeprom_mapping
def __init__(self):
eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
for x in range(0, self.port_end + 1):
if x >= self.port_start and x <= self.port_end:
self._port_to_eeprom_mapping[x] = eeprom_path.format(x - self.EEPROM_OFFSET)
else:
self._port_to_eeprom_mapping[x] = eeprom_path.format(x - x)
SfpUtilBase.__init__(self)
def get_presence(self, port_num):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
presence_path = "/sys/devices/platform/delta-et6248brb-gpio.0/SFP/sfp_mod_p{}"
try:
reg_file = open(presence_path.format(port_num - 47))
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False
if int(reg_file.readline()) == 0:
return True
return False
def get_low_power_mode(self, port_num):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
return False
def set_low_power_mode(self, port_num, lpmode):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
return False
def reset(self, port_num):
# Check for invalid port_num
if port_num < self.port_start or port_num > self.port_end:
return False
return False

View File

@ -0,0 +1,15 @@
# libsensors configuration file for et-6248brb
# ------------------------------------------------
chip "tmp75-i2c-0-48"
label temp1 "0-0048 thermal sensor"
chip "tmp75-i2c-7-49"
label temp1 "7-0048 thermal sensor"
chip "tmp75-i2c-8-4a"
label temp1 "8-004a thermal sensor"
chip "adt7473-i2c-0-2e"
label fan1 "FANTRAY 1"
label fan2 "FANTRAY 2"

View File

@ -25,6 +25,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \
$(DELTA_AG9032V1_PLATFORM_MODULE) \ $(DELTA_AG9032V1_PLATFORM_MODULE) \
$(DELTA_AG9064_PLATFORM_MODULE) \ $(DELTA_AG9064_PLATFORM_MODULE) \
$(DELTA_AG5648_PLATFORM_MODULE) \ $(DELTA_AG5648_PLATFORM_MODULE) \
$(DELTA_ET6248BRB_PLATFORM_MODULE) \
$(QUANTA_IX1B_32X_PLATFORM_MODULE) \ $(QUANTA_IX1B_32X_PLATFORM_MODULE) \
$(MITAC_LY1200_32X_PLATFORM_MODULE) $(MITAC_LY1200_32X_PLATFORM_MODULE)
$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES)

View File

@ -3,10 +3,12 @@
DELTA_AG9032V1_PLATFORM_MODULE_VERSION = 1.1 DELTA_AG9032V1_PLATFORM_MODULE_VERSION = 1.1
DELTA_AG9064_PLATFORM_MODULE_VERSION = 1.1 DELTA_AG9064_PLATFORM_MODULE_VERSION = 1.1
DELTA_AG5648_PLATFORM_MODULE_VERSION = 1.1 DELTA_AG5648_PLATFORM_MODULE_VERSION = 1.1
DELTA_ET6248BRB_PLATFORM_MODULE_VERSION = 1.1
export DELTA_AG9032V1_PLATFORM_MODULE_VERSION export DELTA_AG9032V1_PLATFORM_MODULE_VERSION
export DELTA_AG9064_PLATFORM_MODULE_VERSION export DELTA_AG9064_PLATFORM_MODULE_VERSION
export DELTA_AG5648_PLATFORM_MODULE_VERSION export DELTA_AG5648_PLATFORM_MODULE_VERSION
export DELTA_ET6248BRB_PLATFORM_MODULE_VERSION
DELTA_AG9032V1_PLATFORM_MODULE = platform-modules-ag9032v1_$(DELTA_AG9032V1_PLATFORM_MODULE_VERSION)_amd64.deb DELTA_AG9032V1_PLATFORM_MODULE = platform-modules-ag9032v1_$(DELTA_AG9032V1_PLATFORM_MODULE_VERSION)_amd64.deb
$(DELTA_AG9032V1_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-delta $(DELTA_AG9032V1_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-delta
@ -22,4 +24,8 @@ DELTA_AG5648_PLATFORM_MODULE = platform-modules-ag5648_$(DELTA_AG5648_PLATFORM_M
$(DELTA_AG5648_PLATFORM_MODULE)_PLATFORM = x86_64-delta_ag5648-r0 $(DELTA_AG5648_PLATFORM_MODULE)_PLATFORM = x86_64-delta_ag5648-r0
$(eval $(call add_extra_package,$(DELTA_AG9032V1_PLATFORM_MODULE),$(DELTA_AG5648_PLATFORM_MODULE))) $(eval $(call add_extra_package,$(DELTA_AG9032V1_PLATFORM_MODULE),$(DELTA_AG5648_PLATFORM_MODULE)))
DELTA_ET6248BRB_PLATFORM_MODULE = platform-modules-et-6248brb_$(DELTA_ET6248BRB_PLATFORM_MODULE_VERSION)_amd64.deb
$(DELTA_ET6248BRB_PLATFORM_MODULE)_PLATFORM = x86_64-delta_et-6248brb-r0
$(eval $(call add_extra_package,$(DELTA_AG9032V1_PLATFORM_MODULE),$(DELTA_ET6248BRB_PLATFORM_MODULE)))
SONIC_STRETCH_DEBS += $(DELTA_AG9032V1_PLATFORM_MODULE) SONIC_STRETCH_DEBS += $(DELTA_AG9032V1_PLATFORM_MODULE)

View File

@ -421,7 +421,7 @@ static SENSOR_DEVICE_ATTR(temp1_input, \
S_IRUGO, for_linear_data, NULL, PSU_TEMP1_INPUT); S_IRUGO, for_linear_data, NULL, PSU_TEMP1_INPUT);
static SENSOR_DEVICE_ATTR(fan1_target, \ static SENSOR_DEVICE_ATTR(fan1_target, \
S_IRUGO, for_fan_target, NULL, PSU_FAN1_FAULT); S_IRUGO, for_fan_target, NULL, PSU_FAN1_FAULT);
static SENSOR_DEVICE_ATTR(fan1_set_percentage, S_IWUGO | S_IRUGO, \ static SENSOR_DEVICE_ATTR(fan1_set_percentage, S_IWUSR | S_IRUGO, \
for_linear_data, set_fan_duty_cycle_input, PSU_FAN1_DUTY_CYCLE); for_linear_data, set_fan_duty_cycle_input, PSU_FAN1_DUTY_CYCLE);
static SENSOR_DEVICE_ATTR(fan1_input, \ static SENSOR_DEVICE_ATTR(fan1_input, \
S_IRUGO, for_linear_data, NULL, PSU_FAN1_SPEED); S_IRUGO, for_linear_data, NULL, PSU_FAN1_SPEED);

View File

@ -17,5 +17,11 @@ Description: kernel modules for platform devices such as fan, led, sfp
Package: platform-modules-ag5648 Package: platform-modules-ag5648
Architecture: amd64 Architecture: amd64
Depends: linux-image-3.16.0-5-amd64 Depends: linux-image-4.9.0-5-amd64
Description: kernel modules for platform devices such as fan, led, sfp Description: kernel modules for platform devices such as fan, led, sfp
Package: platform-modules-et-6248brb
Architecture: amd64
Depends: linux-image-4.9.0-5-amd64
Description: kernel modules for platform devices such as fan, led, sfp

View File

@ -1,3 +1,4 @@
ag5648/scripts/ag5648_platform_init.sh usr/local/bin ag5648/scripts/ag5648_platform_init.sh usr/local/bin
ag5648/cfg/ag5648-modules.conf etc/modules-load.d ag5648/cfg/ag5648-modules.conf etc/modules-load.d
ag5648/scripts/led_control usr/local/bin ag5648/scripts/led_control usr/local/bin
systemd/platform-modules-ag5648.service lib/systemd/system

View File

@ -0,0 +1,80 @@
#!/bin/bash
### BEGIN INIT INFO
# Provides: setup-board
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Setup et-6248brb board.
### END INIT INFO
case "$1" in
start)
echo -n "Setting up board... "
depmod -a
rmmod i2c-i801
rmmod i2c-ismt
modprobe i2c-dev
modprobe i2c-i801
modprobe i2c-ismt
modprobe i2c-mux-pca954x
modprobe i2c-mux-gpio
modprobe dni_gpio
modprobe delta_et-6248brb_platform
if [ `uname -a | awk '{print $3}'` = "4.9.0-5-amd64" ]; then
echo "453" > "/sys/class/gpio/export"
echo "454" > "/sys/class/gpio/export"
echo "455" > "/sys/class/gpio/export"
echo "485" > "/sys/class/gpio/export"
echo "489" > "/sys/class/gpio/export"
echo "494" > "/sys/class/gpio/export"
echo "out" > "/sys/class/gpio/gpio453/direction"
echo "out" > "/sys/class/gpio/gpio454/direction"
echo "out" > "/sys/class/gpio/gpio455/direction"
echo "out" > "/sys/class/gpio/gpio485/direction"
echo "out" > "/sys/class/gpio/gpio489/direction"
echo "out" > "/sys/class/gpio/gpio494/direction"
else
echo "197" > "/sys/class/gpio/export"
echo "198" > "/sys/class/gpio/export"
echo "199" > "/sys/class/gpio/export"
echo "229" > "/sys/class/gpio/export"
echo "233" > "/sys/class/gpio/export"
echo "238" > "/sys/class/gpio/export"
echo "out" > "/sys/class/gpio/gpio197/direction"
echo "out" > "/sys/class/gpio/gpio198/direction"
echo "out" > "/sys/class/gpio/gpio199/direction"
echo "out" > "/sys/class/gpio/gpio229/direction"
echo "out" > "/sys/class/gpio/gpio233/direction"
echo "out" > "/sys/class/gpio/gpio238/direction"
fi
/usr/local/bin/et-6248brb_platform_init.sh
sleep 1
echo "Ethernet48" > "/sys/bus/i2c/devices/4-0050/port_name"
echo "Ethernet49" > "/sys/bus/i2c/devices/5-0050/port_name"
echo "done."
;;
stop)
echo "done."
;;
force-reload|restart)
echo "Not supported"
;;
*)
echo "Usage: /etc/init.d/platform-modules-et-6248brb.init {start|stop}"
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,4 @@
et-6248brb/scripts/et-6248brb_platform_init.sh usr/local/bin
et-6248brb/cfg/et-6248brb-modules.conf etc/modules-load.d
et-6248brb/scripts/led_status.sh usr/local/bin
systemd/platform-modules-et-6248brb.service lib/systemd/system

View File

@ -5,7 +5,7 @@ export INSTALL_MOD_DIR:=extra
KVERSION ?= $(shell uname -r) KVERSION ?= $(shell uname -r)
KERNEL_SRC := /lib/modules/$(KVERSION) KERNEL_SRC := /lib/modules/$(KVERSION)
MOD_SRC_DIR:= $(shell pwd) MOD_SRC_DIR:= $(shell pwd)
MODULE_DIRS:= ag9032v1 MODULE_DIRS:= ag9032v1 ag9064 ag5648 et-6248brb
%: %:
dh $@ --with=systemd dh $@ --with=systemd

View File

@ -0,0 +1,13 @@
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
i2c-i801
i2c-isch
i2c-ismt
i2c-dev
i2c-mux
i2c-smbus
i2c-mux-gpio
i2c-mux-pca954x

View File

@ -0,0 +1,2 @@
obj-m := delta_et-6248brb_platform.o dni_gpio.o

View File

@ -0,0 +1,918 @@
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sysfs.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/dmi.h>
#include <linux/version.h>
#include <linux/ctype.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/i2c/pca954x.h>
#include <linux/platform_data/pca953x.h>
#include <linux/i2c-mux.h>
#include <linux/i2c-mux-gpio.h>
#include <linux/i2c/sff-8436.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#define OPTOE_INFO(data) \
.type = "optoe2", .addr = 0x50
#define et6248brb_i2c_device_num(NUM){ \
.name = "delta-et6248brb-i2c-device", \
.id = NUM, \
.dev = { \
.platform_data = &et6248brb_i2c_device_platform_data[NUM], \
.release = device_release, \
}, \
}
#define et6248brb_gpio_num(NUM){ \
.name = "delta-et6248brb-gpio", \
.id = NUM, \
.dev = { \
.platform_data = &et6248brb_gpio_device_platform_data[NUM], \
.release = device_release, \
}, \
}
#define PCA9555_A 0x20
#define PCA9555_B 0x21
#define PCA9555_C 0x23
static struct kobject *kobj_gpio;
static struct kobject *kobj_psu;
static struct kobject *kobj_fan;
static struct kobject *kobj_sfp;
static struct kobject *kobj_others;
/*Define struct to get client of i2c_new_deivce */
struct i2c_client * i2c_client_9547;
enum{
BUS0 = 0,
BUS1,
BUS2,
BUS3,
BUS4,
BUS5,
BUS6,
BUS7,
BUS8,
BUS9,
BUS10,
};
/*---------------- I2C device - start ------------- */
static void device_release(struct device *dev)
{
return;
}
struct i2c_device_platform_data {
int parent;
struct i2c_board_info info;
struct i2c_client *client;
};
/* pca9547 - add 8 bus */
static struct pca954x_platform_mode pca954x_mode[] = {
{ .adap_id = 2,
.deselect_on_exit = 1,
},
{ .adap_id = 3,
.deselect_on_exit = 1,
},
{ .adap_id = 4,
.deselect_on_exit = 1,
},
{ .adap_id = 5,
.deselect_on_exit = 1,
},
{ .adap_id = 6,
.deselect_on_exit = 1,
},
{ .adap_id = 7,
.deselect_on_exit = 1,
},
{ .adap_id = 8,
.deselect_on_exit = 1,
},
{ .adap_id = 9,
.deselect_on_exit = 1,
},
};
static struct pca954x_platform_data pca954x_data = {
.modes = pca954x_mode,
.num_modes = ARRAY_SIZE(pca954x_mode),
};
static struct i2c_board_info __initdata i2c_info_pca9547[] =
{
{
I2C_BOARD_INFO("pca9547", 0x71),
.platform_data = &pca954x_data,
},
};
static struct i2c_device_platform_data et6248brb_i2c_device_platform_data[] = {
{
/* FAN controller (0x2e) */
.parent = 0,
.info = { I2C_BOARD_INFO("adt7473", 0x2e) },
.client = NULL,
},
{
/* tmp75 (0x48) */
.parent = 0,
.info = { I2C_BOARD_INFO("tmp75", 0x48) },
.client = NULL,
},
{
/* EEPROM (0x54) */
.parent = 1,
.info = { I2C_BOARD_INFO("24c08", 0x54) },
.client = NULL,
},
{
/* sfp 1 (0x50) */
.parent = 4,
.info = { OPTOE_INFO() },
.client = NULL,
},
{
/* sfp 2 (0x50) */
.parent = 5,
.info = { OPTOE_INFO() },
.client = NULL,
},
{
/* tmp75 (0x49) */
.parent = 7,
.info = { I2C_BOARD_INFO("tmp75", 0x49) },
.client = NULL,
},
{
/* tmp75 (0x4a) */
.parent = 8,
.info = { I2C_BOARD_INFO("tmp75", 0x4a) },
.client = NULL,
},
};
static struct platform_device et6248brb_i2c_device[] = {
et6248brb_i2c_device_num(0),
et6248brb_i2c_device_num(1),
et6248brb_i2c_device_num(2),
et6248brb_i2c_device_num(3),
et6248brb_i2c_device_num(4),
et6248brb_i2c_device_num(5),
et6248brb_i2c_device_num(6),
};
/*---------------- I2C device - end ------------- */
/*---------------- I2C driver - start ------------- */
static int __init i2c_device_probe(struct platform_device *pdev)
{
struct i2c_device_platform_data *pdata;
struct i2c_adapter *parent;
pdata = pdev->dev.platform_data;
if (!pdata) {
dev_err(&pdev->dev, "Missing platform data\n");
return -ENODEV;
}
parent = i2c_get_adapter(pdata->parent);
if (!parent) {
dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
pdata->parent);
return -ENODEV;
}
pdata->client = i2c_new_device(parent, &pdata->info);
if (!pdata->client) {
dev_err(&pdev->dev, "Failed to create i2c client %s at %d\n",
pdata->info.type, pdata->parent);
return -ENODEV;
}
return 0;
}
static int __exit i2c_deivce_remove(struct platform_device *pdev)
{
struct i2c_adapter *parent;
struct i2c_device_platform_data *pdata;
pdata = pdev->dev.platform_data;
if (!pdata) {
dev_err(&pdev->dev, "Missing platform data\n");
return -ENODEV;
}
if (pdata->client) {
parent = (pdata->client)->adapter;
i2c_unregister_device(pdata->client);
i2c_put_adapter(parent);
}
return 0;
}
static struct platform_driver i2c_device_driver = {
.probe = i2c_device_probe,
.remove = __exit_p(i2c_deivce_remove),
.driver = {
.owner = THIS_MODULE,
.name = "delta-et6248brb-i2c-device",
}
};
/*---------------- I2C driver - end ------------- */
/*---------------- gpio device - start ----------- */
static struct pca953x_platform_data pca9555_data_0 = {
.gpio_base = 200,
};
static struct pca953x_platform_data pca9555_data_1 = {
.gpio_base = 216,
};
static struct pca953x_platform_data pca9555_data_2 = {
.gpio_base = 232,
};
static struct i2c_board_info __initdata i2c_info_pca9555[] =
{
{
I2C_BOARD_INFO("pca9555", 0x20),
.platform_data = &pca9555_data_0,
},
{
I2C_BOARD_INFO("pca9555", 0x21),
.platform_data = &pca9555_data_1,
},
{
I2C_BOARD_INFO("pca9555", 0x23),
.platform_data = &pca9555_data_2,
},
};
static struct i2c_device_platform_data et6248brb_gpio_device_platform_data[] = {
{
/* GPIO expander A (0x20) */
.parent = 0,
.info = { I2C_BOARD_INFO("pca9555", 0x20) },
.client = NULL,
},
{
/* GPIO expander B (0x21) */
.parent = 0,
.info = { I2C_BOARD_INFO("pca9555", 0x21) },
.client = NULL,
},
{
/* GPIO expander C (0x23) */
.parent = 0,
.info = { I2C_BOARD_INFO("pca9555", 0x23) },
.client = NULL,
},
};
static struct platform_device et6248brb_gpio_device[] = {
et6248brb_gpio_num(0),
et6248brb_gpio_num(1),
et6248brb_gpio_num(2),
};
static struct gpio_attribute_data {
uint8_t bus;
uint8_t addr;
uint8_t reg;
uint8_t mask;
char note[150];
};
enum gpio_attributes {
PSU1_SMB_ALERT,
PSU2_SMB_ALERT,
EEPROM_WP,
FAN1_LED_AG,
FAN2_LED_AG,
D_FAN_ALERT,
PSU1_PRES,
PSU2_PRES,
FAN_EEPROM_WP,
D_FAN_M_PRESENT2,
D_FAN_M_PRESENT1,
PSU1_PG,
PSU2_PG,
BCM54282_INT,
SFP_MOD_P1,
SFP_RXLOS_P1,
SFP_MOD_P2,
SFP_RXLOS_P2,
SFP_TX_FAULT_P1,
SFP_TX_FAULT_P2,
SFP_TX_DIS_P1,
SFP_TX_DIS_P2,
OOB_BCM54616S_INT,
};
static struct gpio_attribute_data attribute_data[] = {
//PCA9555_A
[PSU1_SMB_ALERT] = {
.bus = BUS0, .addr = PCA9555_A,
.reg = 0x00, .mask = 1 << 0,
.note = "0=PSU1 interrupt is occurr\n1=PSU1 interrupt is NOT occurr"
},
[PSU2_SMB_ALERT] = {
.bus = BUS0, .addr = PCA9555_A,
.reg = 0x00, .mask = 1 << 3,
.note = "0=PSU2 interrupt is occurr\n1=PSU2 interrupt is NOT occurr"
},
[EEPROM_WP] = {
.bus = BUS0, .addr = PCA9555_A,
.reg = 0x03, .mask = 1 << 3,
.note = "0=SYS eeprom write protect is disable\n1=SYS eeprom write protect is enable and can not be programmed"
},
[FAN1_LED_AG] = {
.bus = BUS0, .addr = PCA9555_A,
.reg = 0x03, .mask = 0x30,
.note = "00=LED off or FAN tray1 is not present\n01=LED Red,FAN tray1 fail\n10=LED Green,FAN tray1 is present\n11=reserved"
},
[FAN2_LED_AG] = {
.bus = BUS0, .addr = PCA9555_A,
.reg = 0x03, .mask = 0xc0,
.note = "00=LED off or FAN tray1 is not present\n01=LED Red,FAN tray1 fail\n10=LED Green,FAN tray1 is present\n11=reserved"
},
//PCA9555_B
[D_FAN_ALERT] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x00, .mask = 1 << 0,
.note ="0=FAN is NOT issue the alram\n1=FAN issue the alarm"
},
[PSU1_PRES] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x00, .mask = 1 << 2,
.note ="0=PSU1 is present\n1=PSU1 is NOT present"
},
[PSU2_PRES] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x00, .mask = 1 << 3,
.note ="0=PSU2 is present\n1=PSU2 is NOT present"
},
[FAN_EEPROM_WP] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 1,
.note ="0=FAN eeprom write protect is disable\n1=FAN eeprom write protect is enable and can not be programmed"
},
[D_FAN_M_PRESENT2] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 2,
.note ="0=FAN2 module is present\n1=FAN2 module is NOT present"
},
[D_FAN_M_PRESENT1] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 3,
.note ="0=FAN1 moduel is present\n1=FAN1 module is NOT present"
},
[PSU1_PG] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 4,
.note ="0=PSU1 is FAIL or not present\n1=PSU1 is GOOD"
},
[PSU2_PG] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 5,
.note ="0=PSU2 is FAIL or not present\n1=PSU2 is GOOD"
},
[BCM54282_INT] = {
.bus = BUS0, .addr = PCA9555_B,
.reg = 0x01, .mask = 1 << 6,
.note ="0=BCM54282 PHY interrupt occurrs\n1=BCM54282 PHY interrupt is not occurrs"
},
//PCA9555_C
[SFP_MOD_P1] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 0,
.note ="0=SFP1 transceiver is present\n1=SFP1 transceiver is NOT present"
},
[SFP_RXLOS_P1] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 1,
.note ="0=SFP1 transceiver is NOT asserted Loss of signal\n1=SFP1 transceiver is asserted Loss of signal"
},
[SFP_MOD_P2] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 2,
.note ="0=SFP1 transceiver is present\n1=SFP1 transceiver is NOT present"
},
[SFP_RXLOS_P2] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 3,
.note ="0=SFP1 transceiver is NOT asserted Loss of signal\n1=SFP1 transceiver is asserted Loss of signal"
},
[SFP_TX_FAULT_P1] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 4,
.note ="0=SFP1 transceiver is NOT asserted TXFAULT signal\n1=SFP1 transceiver is asserted TXFAULT signal"
},
[SFP_TX_FAULT_P2] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x00, .mask = 1 << 5,
.note ="0=SFP1 transceiver is NOT asserted TXFAULT signal\n1=SFP1 transceiver is asserted TXFAULT signal"
},
[SFP_TX_DIS_P1] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x02, .mask = 1 << 6,
.note ="0=SFP1 transceiver is turn ON\n1=SFP1 transceiver is turn OFF"
},
[SFP_TX_DIS_P2] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x02, .mask = 1 << 7,
.note ="0=SFP2 transceiver is turn ON\n1=SFP2 transceiver is turn OFF"
},
[OOB_BCM54616S_INT] = {
.bus = BUS0, .addr = PCA9555_C,
.reg = 0x01, .mask = 1 << 3,
.note ="0=BCM54616S PHY interrupt occurrs\n1=BCM54616S PHY interrupt is not occurrs"
},
};
unsigned char dni_log2 (unsigned char num){
unsigned char num_log2 = 0;
while(num > 0){
num = num >> 1;
num_log2 += 1;
}
return num_log2 -1;
}
void set_direction(struct i2c_device_platform_data *pdata, unsigned char reg, unsigned char mask){
int value;
int read_only;
unsigned char mask_out;
unsigned char set_data;
read_only = 1; //Configuration:GPI
if (reg > 0x1){
reg = reg - 0x02;
read_only = 0; //Configuration:GPO
}
value = i2c_smbus_read_byte_data(pdata->client, reg + 0x06);
mask_out = value & ~(mask);
if(read_only){
set_data = mask_out | mask;
}
else{
set_data = mask_out;
}
i2c_smbus_write_byte_data(pdata->client, reg + 0x06, set_data);
return;
}
static ssize_t get_gpio_reg(struct device *dev, struct device_attribute *dev_attr, char *buf)
{
int ret;
int mask;
int value;
char note[150];
unsigned char pca9555_num;
unsigned char reg;
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
struct device *i2cdev = kobj_to_dev(kobj_gpio);
struct i2c_device_platform_data *pdata = i2cdev->platform_data;
switch(attribute_data[attr->index].addr){
case PCA9555_A:
pca9555_num = 0;
break;
case PCA9555_B:
pca9555_num = 1;
break;
case PCA9555_C:
pca9555_num = 2;
break;
default:
return sprintf(buf, "attribute address error");
}
set_direction(&pdata[pca9555_num], attribute_data[attr->index].reg, attribute_data[attr->index].mask);
switch (attr->index) {
case PSU1_SMB_ALERT ... OOB_BCM54616S_INT:
reg = attribute_data[attr->index].reg;
mask = attribute_data[attr->index].mask;
value = i2c_smbus_read_byte_data(pdata[pca9555_num].client, reg);
sprintf(note, "\n%s\n",attribute_data[attr->index].note);
value = (value & mask);
break;
default:
return sprintf(buf, "%d not found", attr->index);
}
switch (mask) {
case 0xFF:
return sprintf(buf, "0x%02x%s", value, note);
case 0x0F:
return sprintf(buf, "0x%01x%s", value, note);
case 0xF0:
value = value >> 4;
return sprintf(buf, "0x%01x%s", value, note);
case 0xC0:
value = value >> 6;
return sprintf(buf, "0x%01x%s", value, note);
case 0x30:
value = value >> 4;
return sprintf(buf, "0x%01x%s", value, note);
default :
value = value >> dni_log2(mask);
return sprintf(buf, "%d%s", value, note);
}
}
static ssize_t set_gpio_reg(struct device *dev, struct device_attribute *dev_attr,
const char *buf, size_t count)
{
int err;
int value;
unsigned long set_data;
unsigned char set_reg;
unsigned char mask;
unsigned char mask_out;
unsigned char pca9555_num;
struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
struct device *i2cdev = kobj_to_dev(kobj_gpio);
struct i2c_device_platform_data *pdata = i2cdev->platform_data;
err = kstrtoul(buf, 0, &set_data);
if (err){
return err;
}
if (set_data > 0xff){
printk(KERN_ALERT "address out of range (0x00-0xFF)\n");
return count;
}
switch(attribute_data[attr->index].addr){
case PCA9555_A:
pca9555_num = 0;
break;
case PCA9555_B:
pca9555_num = 1;
break;
case PCA9555_C:
pca9555_num = 2;
break;
default:
return sprintf(buf, "attribute address error");
}
set_direction(&pdata[pca9555_num], attribute_data[attr->index].reg, attribute_data[attr->index].mask);
switch (attr->index) {
case PSU1_SMB_ALERT ... OOB_BCM54616S_INT:
set_reg = attribute_data[attr->index].reg;
mask = attribute_data[attr->index].mask;
value = i2c_smbus_read_byte_data(pdata[pca9555_num].client, set_reg);
mask_out = value & ~(mask);
break;
default:
return sprintf(buf, "%d not found", attr->index);
}
switch (mask) {
case 0xFF:
set_data = mask_out | (set_data & mask);
break;
case 0x0F:
set_data = mask_out | (set_data & mask);
break;
case 0xF0:
set_data = set_data << 4;
set_data = mask_out | (set_data & mask);
break;
case 0xC0:
set_data = set_data << 6;
set_data = mask_out | (set_data & mask);
break;
case 0x30:
set_data = set_data << 4;
set_data = mask_out | (set_data & mask);
break;
default :
set_data = mask_out | (set_data << dni_log2(mask) );
}
i2c_smbus_write_byte_data(pdata[pca9555_num].client, set_reg, set_data);
return count;
}
static SENSOR_DEVICE_ATTR(psu1_smb_alert, S_IRUGO, get_gpio_reg, NULL, PSU1_SMB_ALERT);
static SENSOR_DEVICE_ATTR(psu2_smb_alert, S_IRUGO, get_gpio_reg, NULL, PSU2_SMB_ALERT);
static SENSOR_DEVICE_ATTR(eeprom_wp, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, EEPROM_WP);
static SENSOR_DEVICE_ATTR(fan1_led_ag, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, FAN1_LED_AG);
static SENSOR_DEVICE_ATTR(fan2_led_ag, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, FAN2_LED_AG);
static SENSOR_DEVICE_ATTR(d_fan_alert, S_IRUGO, get_gpio_reg, NULL, D_FAN_ALERT);
static SENSOR_DEVICE_ATTR(psu1_pres, S_IRUGO, get_gpio_reg, NULL, PSU1_PRES);
static SENSOR_DEVICE_ATTR(psu2_pres, S_IRUGO, get_gpio_reg, NULL, PSU2_PRES);
static SENSOR_DEVICE_ATTR(fan_eeprom_wp, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, FAN_EEPROM_WP);
static SENSOR_DEVICE_ATTR(d_fan_m_present2, S_IRUGO, get_gpio_reg, NULL, D_FAN_M_PRESENT2);
static SENSOR_DEVICE_ATTR(d_fan_m_present1, S_IRUGO, get_gpio_reg, NULL, D_FAN_M_PRESENT1);
static SENSOR_DEVICE_ATTR(psu1_pg, S_IRUGO, get_gpio_reg, NULL, PSU1_PG);
static SENSOR_DEVICE_ATTR(psu2_pg, S_IRUGO, get_gpio_reg, NULL, PSU2_PG);
static SENSOR_DEVICE_ATTR(bcm54282_int, S_IRUGO, get_gpio_reg, NULL, BCM54282_INT);
static SENSOR_DEVICE_ATTR(sfp_mod_p1, S_IRUGO, get_gpio_reg, NULL, SFP_MOD_P1);
static SENSOR_DEVICE_ATTR(sfp_rxlos_p1, S_IRUGO, get_gpio_reg, NULL, SFP_RXLOS_P1);
static SENSOR_DEVICE_ATTR(sfp_mod_p2, S_IRUGO, get_gpio_reg, NULL, SFP_MOD_P2);
static SENSOR_DEVICE_ATTR(sfp_rxlos_p2, S_IRUGO, get_gpio_reg, NULL, SFP_RXLOS_P2);
static SENSOR_DEVICE_ATTR(sfp_tx_fault_p1, S_IRUGO, get_gpio_reg, NULL, SFP_TX_FAULT_P1);
static SENSOR_DEVICE_ATTR(sfp_tx_fault_p2, S_IRUGO , get_gpio_reg, NULL, SFP_TX_FAULT_P2);
static SENSOR_DEVICE_ATTR(sfp_tx_dis_p1, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, SFP_TX_DIS_P1);
static SENSOR_DEVICE_ATTR(sfp_tx_dis_p2, S_IRUGO | S_IWUSR, get_gpio_reg, set_gpio_reg, SFP_TX_DIS_P2);
static SENSOR_DEVICE_ATTR(oob_bcm54616s_int, S_IRUGO, get_gpio_reg, NULL, OOB_BCM54616S_INT);
static struct attribute *et6248brb_psu_attrs[] = {
&sensor_dev_attr_psu1_smb_alert.dev_attr.attr,
&sensor_dev_attr_psu2_smb_alert.dev_attr.attr,
&sensor_dev_attr_psu1_pres.dev_attr.attr,
&sensor_dev_attr_psu2_pres.dev_attr.attr,
&sensor_dev_attr_psu1_pg.dev_attr.attr,
&sensor_dev_attr_psu2_pg.dev_attr.attr,
NULL,
};
static struct attribute *et6248brb_fan_attrs[] = {
&sensor_dev_attr_fan1_led_ag.dev_attr.attr,
&sensor_dev_attr_fan2_led_ag.dev_attr.attr,
&sensor_dev_attr_d_fan_alert.dev_attr.attr,
&sensor_dev_attr_fan_eeprom_wp.dev_attr.attr,
&sensor_dev_attr_d_fan_m_present1.dev_attr.attr,
&sensor_dev_attr_d_fan_m_present2.dev_attr.attr,
NULL,
};
static struct attribute *et6248brb_sfp_attrs[] = {
&sensor_dev_attr_sfp_mod_p1.dev_attr.attr,
&sensor_dev_attr_sfp_rxlos_p1.dev_attr.attr,
&sensor_dev_attr_sfp_mod_p2.dev_attr.attr,
&sensor_dev_attr_sfp_rxlos_p2.dev_attr.attr,
&sensor_dev_attr_sfp_tx_fault_p1.dev_attr.attr,
&sensor_dev_attr_sfp_tx_fault_p2.dev_attr.attr,
&sensor_dev_attr_sfp_tx_dis_p1.dev_attr.attr,
&sensor_dev_attr_sfp_tx_dis_p2.dev_attr.attr,
NULL,
};
static struct attribute *et6248brb_others_attrs[] = {
&sensor_dev_attr_eeprom_wp.dev_attr.attr,
&sensor_dev_attr_bcm54282_int.dev_attr.attr,
&sensor_dev_attr_oob_bcm54616s_int.dev_attr.attr,
NULL,
};
static struct attribute_group et6248brb_psu_attr_grp = {
.attrs = et6248brb_psu_attrs,
};
static struct attribute_group et6248brb_fan_attr_grp = {
.attrs = et6248brb_fan_attrs,
};
static struct attribute_group et6248brb_sfp_attr_grp = {
.attrs = et6248brb_sfp_attrs,
};
static struct attribute_group et6248brb_others_attr_grp = {
.attrs = et6248brb_others_attrs,
};
/*---------------- gpio device - end ------------- */
/*---------------- gpio driver - start ----------- */
static int __init gpio_device_probe(struct platform_device *pdev)
{
struct i2c_device_platform_data *pdata;
struct i2c_adapter *parent;
int ret;
pdata = pdev->dev.platform_data;
if (!pdata) {
dev_err(&pdev->dev, "Missing platform data\n");
return -ENODEV;
}
parent = i2c_get_adapter(pdata->parent);
if (!parent) {
dev_err(&pdev->dev, "Parent adapter (%d) not found\n",
pdata->parent);
return -ENODEV;
}
pdata->client = i2c_new_device(parent, &pdata->info);
if (!pdata->client) {
dev_err(&pdev->dev, "Failed to create i2c client %s at %d\n",
pdata->info.type, pdata->parent);
return -ENODEV;
}
if(pdata->info.addr == PCA9555_A){
kobj_gpio = &pdev->dev.kobj;
kobj_psu = kobject_create_and_add("PSU", &pdev->dev.kobj);
if (!kobj_psu){
printk(KERN_WARNING "Fail to create 'PSU' directory");
goto error;
}
kobj_fan = kobject_create_and_add("FAN", &pdev->dev.kobj);
if (!kobj_fan){
printk(KERN_WARNING "Fail to create 'FAN' directory");
goto error;
}
kobj_sfp = kobject_create_and_add("SFP", &pdev->dev.kobj);
if (!kobj_sfp){
printk(KERN_WARNING "Fail to create 'SFP' directory");
goto error;
}
kobj_others = kobject_create_and_add("Others", &pdev->dev.kobj);
if (!kobj_others){
printk(KERN_WARNING "Fail to create 'Others' directory");
goto error;
}
ret = sysfs_create_group(kobj_psu, &et6248brb_psu_attr_grp);
if (ret) {
printk(KERN_WARNING "Fail to create 'psu' attribute group");
goto error;
}
ret = sysfs_create_group(kobj_fan, &et6248brb_fan_attr_grp);
if (ret) {
printk(KERN_WARNING "Fail to create 'fan' attribute group");
goto error;
}
ret = sysfs_create_group(kobj_sfp, &et6248brb_sfp_attr_grp);
if (ret) {
printk(KERN_WARNING "Fail to create 'sfp' attribute group");
goto error;
}
ret = sysfs_create_group(kobj_others, &et6248brb_others_attr_grp);
if (ret) {
printk(KERN_WARNING "Fail to create 'others' attribute group");
goto error;
}
}
return 0;
error:
kobject_put(kobj_gpio);
kobject_put(kobj_psu);
kobject_put(kobj_fan);
kobject_put(kobj_sfp);
kobject_put(kobj_others);
i2c_unregister_device(pdata->client);
i2c_put_adapter(parent);
return -ENODEV;
}
static int __exit gpio_deivce_remove(struct platform_device *pdev)
{
struct i2c_adapter *parent;
struct i2c_device_platform_data *pdata;
pdata = pdev->dev.platform_data;
if (!pdata) {
dev_err(&pdev->dev, "Missing platform data\n");
return -ENODEV;
}
if (!pdata) {
dev_err(&pdev->dev, "Missing platform data\n");
}
else if(pdata->info.addr == PCA9555_A){
sysfs_remove_group(kobj_gpio, &et6248brb_psu_attr_grp);
sysfs_remove_group(kobj_fan, &et6248brb_fan_attr_grp);
sysfs_remove_group(kobj_sfp, &et6248brb_sfp_attr_grp);
sysfs_remove_group(kobj_others, &et6248brb_others_attr_grp);
kobject_put(kobj_gpio);
kobject_put(kobj_fan);
kobject_put(kobj_psu);
kobject_put(kobj_sfp);
kobject_put(kobj_others);
}
if (pdata->client) {
if (!parent) {
parent = (pdata->client)->adapter;
}
i2c_unregister_device(pdata->client);
}
i2c_put_adapter(parent);
return 0;
}
static struct platform_driver gpio_device_driver = {
.probe = gpio_device_probe,
.remove = __exit_p(gpio_deivce_remove),
.driver = {
.owner = THIS_MODULE,
.name = "delta-et6248brb-gpio",
}
};
/*---------------- gpio driver - end ------------- */
/*---------------- module initialization ------------- */
static int __init delta_et6248brb_platform_init(void)
{
struct i2c_adapter *adapter;
int ret, i = 0, j = 0;
printk("et6248brb_platform module initialization\n");
//Use pca9547 in i2c_mux_pca954x.c
adapter = i2c_get_adapter(BUS1);
i2c_client_9547 = i2c_new_device(adapter, &i2c_info_pca9547[0]);
i2c_put_adapter(adapter);
// register the i2c devices
ret = platform_driver_register(&i2c_device_driver);
if (ret) {
printk(KERN_WARNING "Fail to register i2c device driver\n");
goto error_i2c_device_driver;
}
// register the i2c devices
ret = platform_driver_register(&gpio_device_driver);
if (ret) {
printk(KERN_WARNING "Fail to register i2c device driver\n");
goto error_gpio_device_driver;
}
for (i = 0; i < ARRAY_SIZE(et6248brb_i2c_device); i++)
{
ret = platform_device_register(&et6248brb_i2c_device[i]);
if (ret) {
printk(KERN_WARNING "Fail to create i2c device %d\n", i);
goto error_et6248brb_i2c_device;
}
}
for (j = 0; j < ARRAY_SIZE(et6248brb_gpio_device); j++)
{
ret = platform_device_register(&et6248brb_gpio_device[j]);
if (ret) {
printk(KERN_WARNING "Fail to create i2c device %d\n", j);
goto error_et6248brb_gpio_device;
}
}
return 0;
error_et6248brb_gpio_device:
j--;
for (; j >= 0; j--) {
platform_device_unregister(&et6248brb_gpio_device[j]);
}
error_et6248brb_i2c_device:
i--;
for (; i >= 0; i--) {
platform_device_unregister(&et6248brb_i2c_device[i]);
}
platform_driver_unregister(&gpio_device_driver);
error_gpio_device_driver:
platform_driver_unregister(&i2c_device_driver);
error_i2c_device_driver:
return ret;
}
static void __exit delta_et6248brb_platform_exit(void)
{
int i = 0;
for ( i = 0; i < ARRAY_SIZE(et6248brb_i2c_device); i++ ) {
platform_device_unregister(&et6248brb_i2c_device[i]);
}
for ( i = 0; i < ARRAY_SIZE(et6248brb_gpio_device); i++ ) {
platform_device_unregister(&et6248brb_gpio_device[i]);
}
platform_driver_unregister(&i2c_device_driver);
platform_driver_unregister(&gpio_device_driver);
i2c_unregister_device(i2c_client_9547);
}
module_init(delta_et6248brb_platform_init);
module_exit(delta_et6248brb_platform_exit);
MODULE_DESCRIPTION("DNI et6248brb Platform Support");
MODULE_AUTHOR("Jacky Liu <jacky.js.liu@deltaww.com>");
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,695 @@
/*
* Intel ICH6-10, Series 5 and 6, Atom C2000 (Avoton/Rangeley) GPIO driver
*
* Copyright (C) 2010 Extreme Engineering Solutions.
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/version.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
#include <linux/ioport.h>
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/mfd/lpc_ich.h>
#define DRV_NAME "gpio_ich"
/*
* GPIO register offsets in GPIO I/O space.
* Each chunk of 32 GPIOs is manipulated via its own USE_SELx, IO_SELx, and
* LVLx registers. Logic in the read/write functions takes a register and
* an absolute bit number and determines the proper register offset and bit
* number in that register. For example, to read the value of GPIO bit 50
* the code would access offset ichx_regs[2(=GPIO_LVL)][1(=50/32)],
* bit 18 (50%32).
*/
enum GPIO_REG {
GPIO_USE_SEL = 0,
GPIO_IO_SEL,
GPIO_LVL,
GPO_BLINK
};
static const u8 ichx_regs[4][3] = {
{0x00, 0x30, 0x40}, /* USE_SEL[1-3] offsets */
{0x04, 0x34, 0x44}, /* IO_SEL[1-3] offsets */
{0x0c, 0x38, 0x48}, /* LVL[1-3] offsets */
{0x18, 0x18, 0x18}, /* BLINK offset */
};
static const u8 ichx_reglen[3] = {
0x30, 0x10, 0x10,
};
static const u8 avoton_regs[4][3] = {
{0x00, 0x80, 0x00},
{0x04, 0x84, 0x00},
{0x08, 0x88, 0x00},
};
static const u8 avoton_reglen[3] = {
0x10, 0x10, 0x00,
};
#define ICHX_WRITE(val, reg, base_res) outl(val, (reg) + (base_res)->start)
#define ICHX_READ(reg, base_res) inl((reg) + (base_res)->start)
struct ichx_desc {
/* Max GPIO pins the chipset can have */
uint ngpio;
/* chipset registers */
const u8 (*regs)[3];
const u8 *reglen;
/* GPO_BLINK is available on this chipset */
bool have_blink;
/* Whether the chipset has GPIO in GPE0_STS in the PM IO region */
bool uses_gpe0;
/* USE_SEL is bogus on some chipsets, eg 3100 */
u32 use_sel_ignore[3];
/* Some chipsets have quirks, let these use their own request/get */
int (*request)(struct gpio_chip *chip, unsigned offset);
int (*get)(struct gpio_chip *chip, unsigned offset);
/*
* Some chipsets don't let reading output values on GPIO_LVL register
* this option allows driver caching written output values
*/
bool use_outlvl_cache;
};
static struct {
spinlock_t lock;
struct platform_device *dev;
struct gpio_chip chip;
struct resource *gpio_base; /* GPIO IO base */
struct resource *pm_base; /* Power Mangagment IO base */
struct ichx_desc *desc; /* Pointer to chipset-specific description */
u32 orig_gpio_ctrl; /* Orig CTRL value, used to restore on exit */
u8 use_gpio; /* Which GPIO groups are usable */
int outlvl_cache[3]; /* cached output values */
} ichx_priv;
static int modparam_gpiobase = -1; /* dynamic */
module_param_named(gpiobase, modparam_gpiobase, int, 0444);
MODULE_PARM_DESC(gpiobase, "The GPIO number base. -1 means dynamic, "
"which is the default.");
static int ichx_write_bit(int reg, unsigned nr, int val, int verify)
{
unsigned long flags;
u32 data, tmp;
int reg_nr = nr / 32;
int bit = nr & 0x1f;
int ret = 0;
spin_lock_irqsave(&ichx_priv.lock, flags);
if (reg == GPIO_LVL && ichx_priv.desc->use_outlvl_cache)
{
data = ichx_priv.outlvl_cache[reg_nr];
}
else
{
data = ICHX_READ(ichx_priv.desc->regs[reg][reg_nr],
ichx_priv.gpio_base);
}
if (val)
data |= 1 << bit;
else
data &= ~(1 << bit);
ICHX_WRITE(data, ichx_priv.desc->regs[reg][reg_nr],
ichx_priv.gpio_base);
if (reg == GPIO_LVL && ichx_priv.desc->use_outlvl_cache)
ichx_priv.outlvl_cache[reg_nr] = data;
tmp = ICHX_READ(ichx_priv.desc->regs[reg][reg_nr],
ichx_priv.gpio_base);
if (verify && data != tmp)
ret = -EPERM;
spin_unlock_irqrestore(&ichx_priv.lock, flags);
return ret;
}
static int ichx_read_bit(int reg, unsigned nr)
{
unsigned long flags;
u32 data;
int reg_nr = nr / 32;
int bit = nr & 0x1f;
spin_lock_irqsave(&ichx_priv.lock, flags);
data = ICHX_READ(ichx_priv.desc->regs[reg][reg_nr],
ichx_priv.gpio_base);
if (reg == GPIO_LVL && ichx_priv.desc->use_outlvl_cache)
data = ichx_priv.outlvl_cache[reg_nr] | data;
spin_unlock_irqrestore(&ichx_priv.lock, flags);
return data & (1 << bit) ? 1 : 0;
}
static bool ichx_gpio_check_available(struct gpio_chip *gpio, unsigned nr)
{
return !!(ichx_priv.use_gpio & (1 << (nr / 32)));
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
static int ichx_gpio_get_direction(struct gpio_chip *gpio, unsigned nr)
{
return ichx_read_bit(GPIO_IO_SEL, nr) ? GPIOF_DIR_IN : GPIOF_DIR_OUT;
}
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
static int ichx_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
{
/*
* Try setting pin as an input and verify it worked since many pins
* are output-only.
*/
if (ichx_write_bit(GPIO_IO_SEL, nr, 1, 1))
return -EINVAL;
return 0;
}
static int ichx_gpio_direction_output(struct gpio_chip *gpio, unsigned nr,
int val)
{
/* Disable blink hardware which is available for GPIOs from 0 to 31. */
if (nr < 32 && ichx_priv.desc->have_blink)
ichx_write_bit(GPO_BLINK, nr, 0, 0);
/* Set GPIO output value. */
ichx_write_bit(GPIO_LVL, nr, val, 0);
/*
* Try setting pin as an output and verify it worked since many pins
* are input-only.
*/
if (ichx_write_bit(GPIO_IO_SEL, nr, 0, 1))
return -EINVAL;
return 0;
}
static int ichx_gpio_get(struct gpio_chip *chip, unsigned nr)
{
return ichx_read_bit(GPIO_LVL, nr);
}
static int ich6_gpio_get(struct gpio_chip *chip, unsigned nr)
{
unsigned long flags;
u32 data;
/*
* GPI 0 - 15 need to be read from the power management registers on
* a ICH6/3100 bridge.
*/
if (nr < 16) {
if (!ichx_priv.pm_base)
return -ENXIO;
spin_lock_irqsave(&ichx_priv.lock, flags);
/* GPI 0 - 15 are latched, write 1 to clear*/
ICHX_WRITE(1 << (16 + nr), 0, ichx_priv.pm_base);
data = ICHX_READ(0, ichx_priv.pm_base);
spin_unlock_irqrestore(&ichx_priv.lock, flags);
return (data >> 16) & (1 << nr) ? 1 : 0;
} else {
return ichx_gpio_get(chip, nr);
}
}
static int ichx_gpio_request(struct gpio_chip *chip, unsigned nr)
{
if (!ichx_gpio_check_available(chip, nr))
return -ENXIO;
/*
* Note we assume the BIOS properly set a bridge's USE value. Some
* chips (eg Intel 3100) have bogus USE values though, so first see if
* the chipset's USE value can be trusted for this specific bit.
* If it can't be trusted, assume that the pin can be used as a GPIO.
*/
if (ichx_priv.desc->use_sel_ignore[nr / 32] & (1 << (nr & 0x1f)))
return 0;
return ichx_read_bit(GPIO_USE_SEL, nr) ? 0 : -ENODEV;
}
static int ich6_gpio_request(struct gpio_chip *chip, unsigned nr)
{
/*
* Fixups for bits 16 and 17 are necessary on the Intel ICH6/3100
* bridge as they are controlled by USE register bits 0 and 1. See
* "Table 704 GPIO_USE_SEL1 register" in the i3100 datasheet for
* additional info.
*/
if (nr == 16 || nr == 17)
nr -= 16;
return ichx_gpio_request(chip, nr);
}
static void ichx_gpio_set(struct gpio_chip *chip, unsigned nr, int val)
{
ichx_write_bit(GPIO_LVL, nr, val, 0);
}
static void ichx_gpiolib_setup(struct gpio_chip *chip)
{
chip->owner = THIS_MODULE;
chip->label = DRV_NAME;
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
chip->dev = &ichx_priv.dev->dev;
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
chip->parent = &ichx_priv.dev->dev;
chip->get_direction = ichx_gpio_get_direction;
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
/* Allow chip-specific overrides of request()/get() */
chip->request = ichx_priv.desc->request ?
ichx_priv.desc->request : ichx_gpio_request;
chip->get = ichx_priv.desc->get ?
ichx_priv.desc->get : ichx_gpio_get;
chip->set = ichx_gpio_set;
chip->direction_input = ichx_gpio_direction_input;
chip->direction_output = ichx_gpio_direction_output;
chip->base = modparam_gpiobase;
chip->ngpio = ichx_priv.desc->ngpio;
chip->can_sleep = false;
chip->dbg_show = NULL;
}
/* ICH6-based, 631xesb-based */
static struct ichx_desc ich6_desc = {
/* Bridges using the ICH6 controller need fixups for GPIO 0 - 17 */
.request = ich6_gpio_request,
.get = ich6_gpio_get,
/* GPIO 0-15 are read in the GPE0_STS PM register */
.uses_gpe0 = true,
.ngpio = 50,
.have_blink = true,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* Intel 3100 */
static struct ichx_desc i3100_desc = {
/*
* Bits 16,17, 20 of USE_SEL and bit 16 of USE_SEL2 always read 0 on
* the Intel 3100. See "Table 712. GPIO Summary Table" of 3100
* Datasheet for more info.
*/
.use_sel_ignore = {0x00130000, 0x00010000, 0x0},
/* The 3100 needs fixups for GPIO 0 - 17 */
.request = ich6_gpio_request,
.get = ich6_gpio_get,
/* GPIO 0-15 are read in the GPE0_STS PM register */
.uses_gpe0 = true,
.ngpio = 50,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* ICH7 and ICH8-based */
static struct ichx_desc ich7_desc = {
.ngpio = 50,
.have_blink = true,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* ICH9-based */
static struct ichx_desc ich9_desc = {
.ngpio = 61,
.have_blink = true,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* ICH10-based - Consumer/corporate versions have different amount of GPIO */
static struct ichx_desc ich10_cons_desc = {
.ngpio = 61,
.have_blink = true,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
static struct ichx_desc ich10_corp_desc = {
.ngpio = 72,
.have_blink = true,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* Intel 5 series, 6 series, 3400 series, and C200 series */
static struct ichx_desc intel5_desc = {
.ngpio = 76,
.regs = ichx_regs,
.reglen = ichx_reglen,
};
/* Avoton */
static struct ichx_desc avoton_desc = {
/* Avoton has only 59 GPIOs, but we assume the first set of register
* (Core) has 32 instead of 31 to keep gpio-ich compliance
*/
.ngpio = 60,
.regs = avoton_regs,
.reglen = avoton_reglen,
.use_outlvl_cache = true,
};
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
static int ichx_gpio_request_regions(struct resource *res_base,
const char *name, u8 use_gpio)
{
int i;
if (!res_base || !res_base->start || !res_base->end)
return -ENODEV;
for (i = 0; i < ARRAY_SIZE(ichx_priv.desc->regs[0]); i++) {
if (!(use_gpio & (1 << i)))
continue;
if (!request_region(
res_base->start + ichx_priv.desc->regs[0][i],
ichx_priv.desc->reglen[i], name))
goto request_err;
}
return 0;
request_err:
/* Clean up: release already requested regions, if any */
for (i--; i >= 0; i--) {
if (!(use_gpio & (1 << i)))
continue;
release_region(res_base->start + ichx_priv.desc->regs[0][i],
ichx_priv.desc->reglen[i]);
}
return -EBUSY;
}
static void ichx_gpio_release_regions(struct resource *res_base, u8 use_gpio)
{
int i;
for (i = 0; i < ARRAY_SIZE(ichx_priv.desc->regs[0]); i++) {
if (!(use_gpio & (1 << i)))
continue;
release_region(res_base->start + ichx_priv.desc->regs[0][i],
ichx_priv.desc->reglen[i]);
}
}
static int ichx_gpio_probe(struct platform_device *pdev)
{
struct resource *res_base, *res_pm;
int err;
struct lpc_ich_info *ich_info = dev_get_platdata(&pdev->dev);
if (!ich_info)
return -ENODEV;
ichx_priv.dev = pdev;
switch (ich_info->gpio_version) {
case ICH_I3100_GPIO:
ichx_priv.desc = &i3100_desc;
break;
case ICH_V5_GPIO:
ichx_priv.desc = &intel5_desc;
break;
case ICH_V6_GPIO:
ichx_priv.desc = &ich6_desc;
break;
case ICH_V7_GPIO:
ichx_priv.desc = &ich7_desc;
break;
case ICH_V9_GPIO:
ichx_priv.desc = &ich9_desc;
break;
case ICH_V10CORP_GPIO:
ichx_priv.desc = &ich10_corp_desc;
break;
case ICH_V10CONS_GPIO:
ichx_priv.desc = &ich10_cons_desc;
break;
case AVOTON_GPIO:
ichx_priv.desc = &avoton_desc;
ichx_priv.outlvl_cache[0] = 0x06; /*core output values*/
ichx_priv.outlvl_cache[1] = 0x7c0008; /*sus output values*/
ichx_priv.outlvl_cache[2] = 0x0; /*no used*/
break;
default:
return -ENODEV;
}
spin_lock_init(&ichx_priv.lock);
res_base = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_GPIO);
ichx_priv.use_gpio = ich_info->use_gpio;
err = ichx_gpio_request_regions(res_base, pdev->name,
ichx_priv.use_gpio);
if (err)
return err;
ichx_priv.gpio_base = res_base;
/*
* If necessary, determine the I/O address of ACPI/power management
* registers which are needed to read the the GPE0 register for GPI pins
* 0 - 15 on some chipsets.
*/
if (!ichx_priv.desc->uses_gpe0)
goto init;
res_pm = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_GPE0);
if (!res_pm) {
pr_warn("ACPI BAR is unavailable, GPI 0 - 15 unavailable\n");
goto init;
}
if (!request_region(res_pm->start, resource_size(res_pm),
pdev->name)) {
pr_warn("ACPI BAR is busy, GPI 0 - 15 unavailable\n");
goto init;
}
ichx_priv.pm_base = res_pm;
init:
ichx_gpiolib_setup(&ichx_priv.chip);
err = gpiochip_add(&ichx_priv.chip);
if (err) {
pr_err("Failed to register GPIOs\n");
goto add_err;
}
pr_info("GPIO from %d to %d on %s\n", ichx_priv.chip.base,
ichx_priv.chip.base + ichx_priv.chip.ngpio - 1, DRV_NAME);
return 0;
add_err:
ichx_gpio_release_regions(ichx_priv.gpio_base, ichx_priv.use_gpio);
if (ichx_priv.pm_base)
release_region(ichx_priv.pm_base->start,
resource_size(ichx_priv.pm_base));
return err;
}
static int ichx_gpio_remove(struct platform_device *pdev)
{
int err;
err = gpiochip_remove(&ichx_priv.chip);
if (err) {
dev_err(&pdev->dev, "%s failed, %d\n",
"gpiochip_remove()", err);
return err;
}
ichx_gpio_release_regions(ichx_priv.gpio_base, ichx_priv.use_gpio);
if (ichx_priv.pm_base)
release_region(ichx_priv.pm_base->start,
resource_size(ichx_priv.pm_base));
return 0;
}
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
static int ichx_gpio_request_regions(struct device *dev,
struct resource *res_base, const char *name, u8 use_gpio)
{
int i;
if (!res_base || !res_base->start || !res_base->end)
return -ENODEV;
for (i = 0; i < ARRAY_SIZE(ichx_priv.desc->regs[0]); i++) {
if (!(use_gpio & (1 << i)))
continue;
if (!devm_request_region(dev,
res_base->start + ichx_priv.desc->regs[0][i],
ichx_priv.desc->reglen[i], name))
return -EBUSY;
}
return 0;
}
static int ichx_gpio_probe(struct platform_device *pdev)
{
struct resource *res_base, *res_pm;
int err;
struct lpc_ich_info *ich_info = dev_get_platdata(&pdev->dev);
if (!ich_info)
return -ENODEV;
ichx_priv.dev = pdev;
switch (ich_info->gpio_version) {
case ICH_I3100_GPIO:
ichx_priv.desc = &i3100_desc;
break;
case ICH_V5_GPIO:
ichx_priv.desc = &intel5_desc;
break;
case ICH_V6_GPIO:
ichx_priv.desc = &ich6_desc;
break;
case ICH_V7_GPIO:
ichx_priv.desc = &ich7_desc;
break;
case ICH_V9_GPIO:
ichx_priv.desc = &ich9_desc;
break;
case ICH_V10CORP_GPIO:
ichx_priv.desc = &ich10_corp_desc;
break;
case ICH_V10CONS_GPIO:
ichx_priv.desc = &ich10_cons_desc;
break;
case AVOTON_GPIO:
ichx_priv.desc = &avoton_desc;
ichx_priv.outlvl_cache[0] = 0x06; /*core output values*/
ichx_priv.outlvl_cache[1] = 0x7c0008; /*sus output values*/
ichx_priv.outlvl_cache[2] = 0x0; /*no used*/
break;
default:
return -ENODEV;
}
spin_lock_init(&ichx_priv.lock);
res_base = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_GPIO);
ichx_priv.use_gpio = ich_info->use_gpio;
err = ichx_gpio_request_regions(&pdev->dev, res_base, pdev->name,
ichx_priv.use_gpio);
if (err)
return err;
ichx_priv.gpio_base = res_base;
/*
* If necessary, determine the I/O address of ACPI/power management
* registers which are needed to read the the GPE0 register for GPI pins
* 0 - 15 on some chipsets.
*/
if (!ichx_priv.desc->uses_gpe0)
goto init;
res_pm = platform_get_resource(pdev, IORESOURCE_IO, ICH_RES_GPE0);
if (!res_pm) {
pr_warn("ACPI BAR is unavailable, GPI 0 - 15 unavailable\n");
goto init;
}
if (!devm_request_region(&pdev->dev, res_pm->start,
resource_size(res_pm), pdev->name)) {
pr_warn("ACPI BAR is busy, GPI 0 - 15 unavailable\n");
goto init;
}
ichx_priv.pm_base = res_pm;
init:
ichx_gpiolib_setup(&ichx_priv.chip);
err = gpiochip_add_data(&ichx_priv.chip, NULL);
if (err) {
pr_err("Failed to register GPIOs\n");
return err;
}
pr_info("GPIO from %d to %d on %s\n", ichx_priv.chip.base,
ichx_priv.chip.base + ichx_priv.chip.ngpio - 1, DRV_NAME);
return 0;
}
static int ichx_gpio_remove(struct platform_device *pdev)
{
gpiochip_remove(&ichx_priv.chip);
return 0;
}
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
static struct platform_driver ichx_gpio_driver = {
.driver = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
.owner = THIS_MODULE,
#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
#endif // #if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
.name = DRV_NAME,
},
.probe = ichx_gpio_probe,
.remove = ichx_gpio_remove,
};
module_platform_driver(ichx_gpio_driver);
MODULE_AUTHOR("Johnson Lu <JOHNSON.LU@deltaww.com>");
MODULE_DESCRIPTION("GPIO interface for Intel ICH series");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:"DRV_NAME);

View File

@ -0,0 +1,11 @@
#!/bin/bash
#platform init script for Delta et-6248brb
#fan speed monitol start
/usr/share/sonic/device/x86_64-delta_et-6248brb-r0/fancontrol.service /usr/share/sonic/device/x86_64-delta_et-6248brb-r0/fancontrol &
sh /usr/local/bin/led_status.sh &
exit 0

View File

@ -0,0 +1,165 @@
#!/bin/bash
FAN1_EEPROM="-y 0 0x55 0x0a"
FAN2_EEPROM="-y 0 0x56 0x0a"
FAN1_RPM="/sys/bus/i2c/devices/0-002e/fan1_input"
FAN2_RPM="/sys/bus/i2c/devices/0-002e/fan2_input"
FAN_TRAY1_LED="/sys/devices/platform/delta-et6248brb-gpio.0/FAN/fan1_led_ag"
FAN_TRAY2_LED="/sys/devices/platform/delta-et6248brb-gpio.0/FAN/fan2_led_ag"
if [ `uname -a | awk '{print $3}'` = "4.9.0-5-amd64" ]; then
SYS_LED_G="/sys/class/gpio/gpio453/value"
SYS_LED_R="/sys/class/gpio/gpio454/value"
PWR_LED_G="/sys/class/gpio/gpio455/value"
PWR_LED_R="/sys/class/gpio/gpio489/value"
FAN_LED_G="/sys/class/gpio/gpio485/value"
FAN_LED_R="/sys/class/gpio/gpio494/value"
else
SYS_LED_G="/sys/class/gpio/gpio197/value"
SYS_LED_R="/sys/class/gpio/gpio198/value"
PWR_LED_G="/sys/class/gpio/gpio199/value"
PWR_LED_R="/sys/class/gpio/gpio233/value"
FAN_LED_G="/sys/class/gpio/gpio229/value"
FAN_LED_R="/sys/class/gpio/gpio238/value"
fi
PSU1_EEPROM="-y 2 0x50 0x00"
PSU2_EEPROM="-y 3 0x51 0x00"
PSU1_PG="/sys/devices/platform/delta-et6248brb-gpio.0/PSU/psu1_pg"
PSU2_PG="/sys/devices/platform/delta-et6248brb-gpio.0/PSU/psu2_pg"
catfaneeprom(){
fan_eeprom_num=0
i2cget $FAN1_EEPROM > /dev/null 2>&1
if [ "`echo $?`" -eq "0" ]; then
fan_eeprom_num=$((fan_eeprom_num+1))
elif [ "`echo $?`" -ne "0" ]; then
fan_eeprom_num=$((fan_eeprom_num))
fi
i2cget $FAN2_EEPROM > /dev/null 2>&1
if [ "`echo $?`" -eq "0" ]; then
fan_eeprom_num=$((fan_eeprom_num+1))
elif [ "`echo $?`" -ne "0" ]; then
fan_eeprom_num=$((fan_eeprom_num_num))
fi
}
catfanspeed(){
fan_rpm_normal_num=0
fan1_rpm_normal_num=0
fan1_rpm=`cat $FAN1_RPM`
if [ "${fan1_rpm}" -ne "960" ] && [ "${fan1_rpm}" -ne "0" ]; then
fan1_rpm_normal_num=$((fan1_rpm_normal_num+1))
elif [ "${fan1_rpm}" -eq "960" ] || [ "${fan1_rpm}" -eq "0" ]; then
fan1_rpm_normal_num=$((fan1_rpm_normal_num))
fi
fan2_rpm_normal_num=0
fan2_rpm=`cat $FAN2_RPM`
if [ "${fan2_rpm}" -ne "960" ] && [ "${fan2_rpm}" -ne "0" ]; then
fan2_rpm_normal_num=$((fan2_rpm_normal_num+1))
elif [ "${fan2_rpm}" -eq "960" ] || [ "${fan2_rpm}" -eq "0" ]; then
fan2_rpm_normal_num=$((fan2_rpm_normal_num))
fi
fan_rpm_normal_num=$((fan1_rpm_normal_num+fan2_rpm_normal_num))
}
setfanled(){
if [ "${fan_eeprom_num}" -eq "2" ] && [ "${fan_rpm_normal_num}" -eq "2" ]; then
echo "1" > $FAN_LED_G
echo "0" > $FAN_LED_R
elif [ "${fan_eeprom_num}" -lt "2" ] || [ "${fan_rpm_normal_num}" -lt "2" ]; then
echo "1" > $FAN_LED_R
echo "0" > $FAN_LED_G
fi
}
setfantrayled(){
if [ "${fan1_rpm_normal_num}" -eq "1" ]; then
echo "0x02" > $FAN_TRAY1_LED
else
echo "0x01" > $FAN_TRAY1_LED
fi
if [ "${fan2_rpm_normal_num}" -eq "1" ]; then
echo "0x02" > $FAN_TRAY2_LED
else
echo "0x01" > $FAN_TRAY2_LED
fi
}
catpsueeprom(){
psu_eeprom_num=0
i2cget $PSU1_EEPROM > /dev/null 2>&1
if [ "`echo $?`" -eq "0" ]; then
psu_eeprom_num=$((psu_eeprom_num+1))
elif [ "`echo $?`" -ne "0" ]; then
psu_eeprom_num=$((psu_eeprom_num))
fi
i2cget $PSU2_EEPROM > /dev/null 2>&1
if [ "`echo $?`" -eq "0" ]; then
psu_eeprom_num=$((psu_eeprom_num+1))
elif [ "`echo $?`" -ne "0" ]; then
psu_eeprom_num=$((psu_eeprom_num))
fi
}
catpsupowergood(){
psu_normal_num=0
psu1_normal_num=0
psu1_good=`cat $PSU1_PG | head -n 1`
if [ "${psu1_good}" -eq "1" ]; then
psu1_normal_num=$((psu1_normal_num+1))
elif [ "${psu1_good}" -eq "0" ]; then
psu1_normal_num=$((psu1_normal_num))
fi
psu2_normal_num=0
psu2_good=`cat $PSU2_PG | head -n 1`
if [ "${psu2_good}" -eq "1" ]; then
psu2_normal_num=$((psu2_normal_num+1))
elif [ "${psu2_good}" -eq "0" ]; then
psu2_normal_num=$((psu2_normal_num))
fi
psu_normal_num=$((psu1_normal_num+psu2_normal_num))
}
setpsuled(){
if [ "${psu_eeprom_num}" -eq "2" ] && [ "${psu_normal_num}" -eq "2" ]; then
echo "1" > $PWR_LED_G
echo "0" > $PWR_LED_R
elif [ "${psu_eeprom_num}" -lt "2" ] || [ "${psu_normal_num}" -lt "2" ]; then
echo "1" > $PWR_LED_R
echo "0" > $PWR_LED_G
fi
}
platformstatus(){
echo "1" > $SYS_LED_G
echo "0" > $SYS_LED_R
catfaneeprom
catfanspeed
setfanled
setfantrayled
catpsueeprom
catpsupowergood
setpsuled
}
while true
do
platformstatus
sleep 1
done

View File

@ -0,0 +1,13 @@
[Unit]
Description=Delta ag5648 Platform modules
After=local-fs.target
Before=pmon.service
[Service]
Type=oneshot
ExecStart=-/etc/init.d/platform-modules-ag5648 start
ExecStop=-/etc/init.d/platform-modules-ag5648 stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,13 @@
[Unit]
Description=Delta et-6248brb Platform modules
After=local-fs.target
Before=pmon.service
[Service]
Type=oneshot
ExecStart=-/etc/init.d/platform-modules-et-6248brb start
ExecStop=-/etc/init.d/platform-modules-et-6248brb stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target