Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- retval= #global return value for subroutines
- if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
- portslist="0 1 2 3 4 5 6 7"
- fi
- if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7621) -eq 1 ]; then
- portslist="0 1 2 3 4 5 6"
- fi
- link_up() {
- #echo "Port: $1"
- state=$(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi")
- #echo "Get state: $state"
- let "state &= 0xf7ff"
- #echo "Modded state: $(printf "0x%x" $state)"
- mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $state)
- mii_mgr -s -p $1 -r 0 -v 0x9000
- #echo "Link up finished";echo
- }
- link_down() {
- #echo "Port: $1"
- state=$(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi")
- #echo "Get state: $state"
- let "state |= 0x800"
- #echo "Modded state: $(printf "0x%x" $state)"
- mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $state)
- #echo "Link down finished";echo
- }
- reset_port()
- {
- value=$(( $(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi") ))
- let "value |= 1<<15"
- mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $value)
- value=$(( $(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi") ))
- let "value |= 1<<9"
- mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $value)
- }
- reset_ports()
- {
- for port in `seq 0 4`; do
- reset_port $port
- done
- sleep 1
- for port in `seq 0 4`; do
- link_down $port
- done
- sleep 1
- for port in `seq 0 4`; do
- link_up $port
- done
- }
- BIT()
- {
- retval=$((1 << $1))
- }
- PCR()
- {
- retval=$(( 0x2004 | $(( $1 << 8 )) ))
- }
- PVC()
- {
- retval=$(( 0x2010 | $(( $1 << 8 )) ))
- }
- PPB()
- {
- retval=$(( 0x2014 + $(( $1 * 0x100 )) ))
- }
- VTIM()
- {
- #retval=$(awk "BEGIN{print 0x100 + 4 * ($1 / 2)}") #floating math is wrong
- retval=$(( 0x100 + $(( 4 * $(( $1 / 2 )) )) ))
- }
- detect_ip1001()
- {
- if [ $(( $(mii_mgr -g -p 5 -r 2 | sed -e "s/.* = /0x/gi") )) -eq $((0x0243)) ]; then
- if [ $(( $(mii_mgr -g -p 5 -r 3 | sed -e "s/.* = /0x/gi") & 0xfff0 )) -eq $((0x0D90)) ]; then
- retval=1
- else
- retval=0
- fi
- else
- retval=0
- fi
- }
- writereg()
- {
- local wreg=$(printf "0x%x" $1)
- local wval=$(printf "0x%x" $2)
- switch reg w $wreg $wval >> /dev/null
- #echo "w: $wreg $wval"
- }
- readreg()
- {
- local wreg=$(printf "0x%x" $1)
- retval=$(( 0x$(switch reg r $wreg | sed "s/.*=//gi") ))
- #echo "r: $wreg=$(printf "0x%x" $retval)"
- }
- configswitch()
- {
- reset_ports
- detect_ip1001
- if [ $retval -eq 1 ]; then
- #ip1001 have to be reset by software
- reset_port 5
- fi
- local vlan_enable=$(uci get network.@switch[0].enable_vlan | grep -c 1)
- if [ $vlan_enable -eq 0 ]; then
- for i in $portslist; do
- PCR $i;
- writereg $retval 0x00ff0000
- done
- for i in $portslist; do
- PVC $i;
- writereg $retval 0x810000c0
- done
- return 0
- fi
- local i=0
- for i in $portslist; do
- PCR $i;
- writereg $retval 0x00ff0003
- done
- i=0
- #getting list of tagged and untagged ports
- tagports=""
- untagports=""
- while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
- vid=$(uci -q get network.@switch_vlan[$i].vlan)
- taggedlist=$(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9][^t]//gi" -e "s/t//gi")
- untaggedlist=$(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9]t//gi")
- # echo "vlan $i: t[$taggedlist] u[$untaggedlist]"
- for j in $portslist; do
- if [ $(echo $taggedlist | grep -c $j) -ge 1 ]; then
- if [ $(echo $tagports | grep -c $j) -eq 0 ]; then
- tagports="$j $tagports"
- fi
- fi
- if [ $(echo $untaggedlist | grep -c $j) -ge 1 ]; then
- if [ $(echo $untagports | grep -c $j) -eq 0 ]; then
- untagports="$j $untagports"
- fi
- fi
- done
- let i++
- done
- echo "list: t[$tagports] u[$untagports]"
- for i in $portslist; do
- local val="0x81000000"
- if [ $(echo $tagports | grep -c $i) -eq 0 ]; then
- if [ $(echo $untagports | grep -c $i) -ge 1 ]; then
- val="0x810000c0"
- fi
- fi
- PVC $i
- writereg $retval $val
- done
- i=0
- while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
- vid=$(uci -q get network.@switch_vlan[$i].vlan)
- if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
- if [ $i -gt 15 ]; then
- echo -e "\n\nMaximum VLAN entries [$i] count reached!";
- break
- fi
- #vid of vlan
- VTIM $i;reg=$retval
- readreg $reg;val=$retval
- if [ $(( $i % 2 )) -eq 0 ]; then
- let "val &= 0xfff000"
- let "val |= vid"
- else
- let "val &= 0xfff"
- let "val |= (vid << 12)"
- fi
- writereg $reg $val
- else
- if [ $i -gt 4094 ]; then
- echo -e "\n\nMaximum VLAN entries [$i] count reached!";
- break
- fi
- fi
- #vlan port membership
- member=0; etags=0;
- for j in $(uci -q get network.@switch_vlan[$i].ports | sed -e "s/t//gi"); do
- let "member |= 1 << j"
- done
- for j in $(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9][^t]//gi" -e "s/t//gi"); do
- let "etags |= 1 << j"
- done
- printf "vlan %d: members: 0x%x, etags: 0x%x\n" $vid $member $etags
- if [ $member -ne 0 ]; then
- val=1
- let "val |= member << 16"
- let "val |= 1 << 30"
- let "val |= 1 << 28"
- writereg 0x94 $val
- else
- writereg 0x94 0x0
- fi
- #egress mode
- val=0
- for j in $portslist; do
- if [ $(( $etags & $(( 1 << $j )) )) -ne 0 ]; then
- let "val |= 2 << (j * 2)"
- else
- let "val |= 0 << (j * 2)"
- fi
- done
- writereg 0x98 $val
- #write to vlan table
- echo "write to vlan table"
- if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
- val=$i
- else
- val=$vid
- fi
- let "val |= (1 << 31)"
- let "val |= (1 << 12)"
- writereg 0x90 $val
- j=0
- while [ $j -lt 20 ]; do
- readreg 0x90
- val=$retval
- if [ $(( $val & $(( 1 << 31 )) )) -eq 0 ]; then break; fi
- usleep 1000
- # sleep 1
- let j++
- done
- if [ $j -eq 20 ]; then echo "vtcr timeout"; fi
- let i++
- done
- #port default PVID
- for j in $portslist; do
- pvid=1
- i=-1
- while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
- vid=$(uci -q get network.@switch_vlan[$i].vlan)
- if [ $(uci -q get network.@switch_vlan[$i].ports | grep -c $j) -ge 1 ]; then pvid=$vid; fi
- let i--
- done
- i=-1
- while [ "$(uci -q get network.@switch_port[$i])" == "switch_port" ]; do
- vid=$(uci -q get network.@switch_port[$i].pvid)
- port=$(uci -q get network.@switch_port[$i].port)
- if [ $(($j-$port)) -eq 0 ]; then pvid=$vid; printf "Found pvid $vid for port $port, set as default... "; fi
- let i--
- done
- echo "port $j: pvid $pvid"
- port=$j
- let "port &= 0x7"
- PPB $port; reg=$retval;
- readreg $reg
- val=$retval
- let "val &= 0xfffff000"
- let "val |= pvid"
- writereg $reg $val
- let j++
- done
- #port accept mode
- printf "Set access mode: "
- for j in $portslist; do
- printf "$j "
- PVC $j; reg=$retval;
- readreg $reg
- val=$retval
- let "val &= 0xfffffffc"
- writereg $reg $val
- done
- echo "... Done!"
- switch clear
- exit 0;
- }
- portlink()
- {
- num=$1
- reg=$(printf "0x3%d08" $num)
- if [ $(echo $portslist | grep -c $num) -eq 0 ]; then echo "Wrong port number: $num!";exit 1; fi
- link=0
- value=0
- detect_ip1001
- if [ $(( $retval & ($num == 5) )) -eq 1 ]; then
- # P5 is ICPLUS IP1001 gphy
- reg=$(( $(mii_mgr -g -p 5 -r 0 | sed -e "s/.* = /0x/gi") ))
- reg2=$(( $(mii_mgr -g -p 5 -r 1 | sed -e "s/.* = /0x/gi") ))
- reg3=$(( $(mii_mgr -g -p 5 -r 17 | sed -e "s/.* = /0x/gi") ))
- speed=$(( ($reg3 >> 13 ) & 3 ))
- link=$(( ($reg3 >> 15) & 1 ))
- duplex=$(( ($reg3 >> 12) & 1 ))
- auto=$(( ($reg2 & (1 << 5)) >> 5 ))
- rxflow=0
- txflow=0
- value=$(($(printf "0x%x%x" $reg $reg3)))
- else
- #any other mt7530 port
- readreg $reg
- value=$retval
- duplex=$(( $(( $value >> 1 )) & 1 ))
- link=$(( $value & 1 ))
- speed=$(( $(( $value >> 2 )) & 3 ))
- rxflow=$(( $(( $value >> 5 )) & 1 ))
- txflow=$(( $(( $value >> 4 )) & 1 ))
- auto=0
- fi
- if [ $speed -eq 0 ]; then speedstr="10baseT";fi
- if [ $speed -eq 1 ]; then speedstr="100baseTX";fi
- if [ $speed -eq 2 ] || [ $speed -eq 3 ]; then speedstr="1000baseT";fi
- if [ "$speedstr" == "" ]; then speedstr="Unknown";fi
- rxflowstr="";txflowstr="";
- if [ $rxflow -eq 1 ]; then rxflowstr="rxflow "; fi
- if [ $txflow -eq 1 ]; then txflowstr="txflow "; fi
- duplexstr="half-duplex "
- if [ $duplex -eq 1 ]; then duplexstr="full-duplex ";fi
- if [ $auto -eq 1 ]; then autostr="auto "; else autostr="";fi
- if [ $link -eq 1 ]; then
- printf "Port %d:\n\tlink: port:%d link:up speed:%s %s%s%s%sraw:0x%x\n" $num $num "$speedstr" "$duplexstr" "$txflowstr" "$rxflowstr" "$autostr" "$value"
- else
- printf "Port %d:\n\tlink: port:%d link:down raw:0x%x\n" $num $num $value
- fi
- }
- if [ "$1" == "portdump" ] || [ "$3" == "show" ]; then
- for i in $portslist; do
- portlink $i
- echo
- done
- exit 0;
- fi
- if [ "$1" == "port" ]; then
- portlink $2
- exit 0;
- fi
- if [ "$1" == "init" ]; then
- configswitch
- exit 0;
- fi
- if [ "$1" == "list" ]; then
- echo "Found: switch0 - mt7530"
- exit 0;
- fi
- if [ "$1" == "dev" ]; then
- #swconfig emu
- echo "Found: switch0 - mt7530"
- if [ "$3" == "apply" ]; then
- configswitch
- fi
- if [ "$3" == "help" ]; then
- if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
- echo "switch0: mt7620(MT7620), ports: 8 (cpu @ 7), vlans: 4096"
- else
- echo "switch0: mt7530(MT7530), ports: 7 (cpu @ 6), vlans: 4096"
- fi
- cat << EOF
- --switch
- Attribute 1 (int): enable_vlan (Enable VLAN mode)
- Attribute 2 (int): enable_vlan4k (Enable VLAN 4K mode)
- Attribute 3 (none): apply (Activate changes in the hardware)
- Attribute 4 (none): reset (Reset the switch)
- --vlan
- Attribute 1 (string): info (Get vlan information)
- Attribute 2 (int): fid (Get/Set vlan FID)
- Attribute 3 (ports): ports (VLAN port mapping)
- --port
- Attribute 1 (string): mib (Get MIB counters for port)
- Attribute 2 (int): pvid (Primary VLAN ID)
- Attribute 3 (string): link (Get port link information)
- EOF
- fi
- exit 0;
- fi
- echo "Usage:"
- echo "$0 portdump - dumps all ports state"
- echo "$0 port n - dumps port 'n' state"
- echo "$0 init - init switch"
Advertisement
Add Comment
Please, Sign In to add comment