sta-s2z

Untitled

Oct 24th, 2017
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.79 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. retval= #global return value for subroutines
  4.  
  5. if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
  6. portslist="0 1 2 3 4 5 6 7"
  7. fi
  8.  
  9. if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7621) -eq 1 ]; then
  10. portslist="0 1 2 3 4 5 6"
  11. fi
  12.  
  13. link_up() {
  14. #echo "Port: $1"
  15. state=$(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi")
  16. #echo "Get state: $state"
  17. let "state &= 0xf7ff"
  18. #echo "Modded state: $(printf "0x%x" $state)"
  19. mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $state)
  20. mii_mgr -s -p $1 -r 0 -v 0x9000
  21. #echo "Link up finished";echo
  22. }
  23.  
  24. link_down() {
  25. #echo "Port: $1"
  26. state=$(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi")
  27. #echo "Get state: $state"
  28. let "state |= 0x800"
  29. #echo "Modded state: $(printf "0x%x" $state)"
  30. mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $state)
  31. #echo "Link down finished";echo
  32. }
  33.  
  34. reset_port()
  35. {
  36. value=$(( $(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi") ))
  37. let "value |= 1<<15"
  38. mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $value)
  39.  
  40. value=$(( $(mii_mgr -g -p $1 -r 0 | sed -e "s/.* = /0x/gi") ))
  41. let "value |= 1<<9"
  42. mii_mgr -s -p $1 -r 0 -v $(printf "0x%x" $value)
  43. }
  44.  
  45. reset_ports()
  46. {
  47. for port in `seq 0 4`; do
  48. reset_port $port
  49. done
  50. sleep 1
  51. for port in `seq 0 4`; do
  52. link_down $port
  53. done
  54. sleep 1
  55. for port in `seq 0 4`; do
  56. link_up $port
  57. done
  58. }
  59.  
  60. BIT()
  61. {
  62. retval=$((1 << $1))
  63. }
  64. PCR()
  65. {
  66. retval=$(( 0x2004 | $(( $1 << 8 )) ))
  67. }
  68.  
  69. PVC()
  70. {
  71. retval=$(( 0x2010 | $(( $1 << 8 )) ))
  72. }
  73.  
  74. PPB()
  75. {
  76. retval=$(( 0x2014 + $(( $1 * 0x100 )) ))
  77. }
  78.  
  79. VTIM()
  80. {
  81. #retval=$(awk "BEGIN{print 0x100 + 4 * ($1 / 2)}") #floating math is wrong
  82. retval=$(( 0x100 + $(( 4 * $(( $1 / 2 )) )) ))
  83. }
  84.  
  85. detect_ip1001()
  86. {
  87. if [ $(( $(mii_mgr -g -p 5 -r 2 | sed -e "s/.* = /0x/gi") )) -eq $((0x0243)) ]; then
  88. if [ $(( $(mii_mgr -g -p 5 -r 3 | sed -e "s/.* = /0x/gi") & 0xfff0 )) -eq $((0x0D90)) ]; then
  89. retval=1
  90. else
  91. retval=0
  92. fi
  93. else
  94. retval=0
  95. fi
  96. }
  97.  
  98. writereg()
  99. {
  100. local wreg=$(printf "0x%x" $1)
  101. local wval=$(printf "0x%x" $2)
  102. switch reg w $wreg $wval >> /dev/null
  103. #echo "w: $wreg $wval"
  104. }
  105. readreg()
  106. {
  107. local wreg=$(printf "0x%x" $1)
  108. retval=$(( 0x$(switch reg r $wreg | sed "s/.*=//gi") ))
  109. #echo "r: $wreg=$(printf "0x%x" $retval)"
  110. }
  111.  
  112. configswitch()
  113. {
  114. reset_ports
  115.  
  116. detect_ip1001
  117.  
  118. if [ $retval -eq 1 ]; then
  119.  
  120. #ip1001 have to be reset by software
  121. reset_port 5
  122.  
  123. fi
  124.  
  125. local vlan_enable=$(uci get network.@switch[0].enable_vlan | grep -c 1)
  126.  
  127. if [ $vlan_enable -eq 0 ]; then
  128. for i in $portslist; do
  129. PCR $i;
  130. writereg $retval 0x00ff0000
  131. done
  132. for i in $portslist; do
  133. PVC $i;
  134. writereg $retval 0x810000c0
  135. done
  136. return 0
  137. fi
  138. local i=0
  139. for i in $portslist; do
  140. PCR $i;
  141. writereg $retval 0x00ff0003
  142. done
  143.  
  144. i=0
  145. #getting list of tagged and untagged ports
  146. tagports=""
  147. untagports=""
  148. while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
  149. vid=$(uci -q get network.@switch_vlan[$i].vlan)
  150. taggedlist=$(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9][^t]//gi" -e "s/t//gi")
  151. untaggedlist=$(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9]t//gi")
  152. # echo "vlan $i: t[$taggedlist] u[$untaggedlist]"
  153. for j in $portslist; do
  154. if [ $(echo $taggedlist | grep -c $j) -ge 1 ]; then
  155. if [ $(echo $tagports | grep -c $j) -eq 0 ]; then
  156. tagports="$j $tagports"
  157. fi
  158. fi
  159. if [ $(echo $untaggedlist | grep -c $j) -ge 1 ]; then
  160. if [ $(echo $untagports | grep -c $j) -eq 0 ]; then
  161. untagports="$j $untagports"
  162. fi
  163. fi
  164. done
  165. let i++
  166. done
  167. echo "list: t[$tagports] u[$untagports]"
  168. for i in $portslist; do
  169. local val="0x81000000"
  170. if [ $(echo $tagports | grep -c $i) -eq 0 ]; then
  171. if [ $(echo $untagports | grep -c $i) -ge 1 ]; then
  172. val="0x810000c0"
  173. fi
  174. fi
  175. PVC $i
  176. writereg $retval $val
  177. done
  178.  
  179. i=0
  180. while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
  181. vid=$(uci -q get network.@switch_vlan[$i].vlan)
  182. if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
  183. if [ $i -gt 15 ]; then
  184. echo -e "\n\nMaximum VLAN entries [$i] count reached!";
  185. break
  186. fi
  187. #vid of vlan
  188. VTIM $i;reg=$retval
  189. readreg $reg;val=$retval
  190.  
  191. if [ $(( $i % 2 )) -eq 0 ]; then
  192. let "val &= 0xfff000"
  193. let "val |= vid"
  194. else
  195. let "val &= 0xfff"
  196. let "val |= (vid << 12)"
  197. fi
  198. writereg $reg $val
  199. else
  200. if [ $i -gt 4094 ]; then
  201. echo -e "\n\nMaximum VLAN entries [$i] count reached!";
  202. break
  203. fi
  204. fi
  205.  
  206. #vlan port membership
  207. member=0; etags=0;
  208. for j in $(uci -q get network.@switch_vlan[$i].ports | sed -e "s/t//gi"); do
  209. let "member |= 1 << j"
  210. done
  211.  
  212. for j in $(uci -q get network.@switch_vlan[$i].ports | sed -e "s/[0-9][^t]//gi" -e "s/t//gi"); do
  213. let "etags |= 1 << j"
  214. done
  215. printf "vlan %d: members: 0x%x, etags: 0x%x\n" $vid $member $etags
  216. if [ $member -ne 0 ]; then
  217. val=1
  218. let "val |= member << 16"
  219. let "val |= 1 << 30"
  220. let "val |= 1 << 28"
  221. writereg 0x94 $val
  222. else
  223. writereg 0x94 0x0
  224. fi
  225.  
  226. #egress mode
  227. val=0
  228. for j in $portslist; do
  229. if [ $(( $etags & $(( 1 << $j )) )) -ne 0 ]; then
  230. let "val |= 2 << (j * 2)"
  231. else
  232. let "val |= 0 << (j * 2)"
  233. fi
  234. done
  235. writereg 0x98 $val
  236.  
  237. #write to vlan table
  238. echo "write to vlan table"
  239. if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
  240. val=$i
  241. else
  242. val=$vid
  243. fi
  244. let "val |= (1 << 31)"
  245. let "val |= (1 << 12)"
  246. writereg 0x90 $val
  247. j=0
  248. while [ $j -lt 20 ]; do
  249. readreg 0x90
  250. val=$retval
  251. if [ $(( $val & $(( 1 << 31 )) )) -eq 0 ]; then break; fi
  252. usleep 1000
  253. # sleep 1
  254. let j++
  255. done
  256. if [ $j -eq 20 ]; then echo "vtcr timeout"; fi
  257. let i++
  258. done
  259. #port default PVID
  260.  
  261. for j in $portslist; do
  262. pvid=1
  263. i=-1
  264. while [ "$(uci -q get network.@switch_vlan[$i])" == "switch_vlan" ]; do
  265. vid=$(uci -q get network.@switch_vlan[$i].vlan)
  266. if [ $(uci -q get network.@switch_vlan[$i].ports | grep -c $j) -ge 1 ]; then pvid=$vid; fi
  267. let i--
  268. done
  269. i=-1
  270. while [ "$(uci -q get network.@switch_port[$i])" == "switch_port" ]; do
  271. vid=$(uci -q get network.@switch_port[$i].pvid)
  272. port=$(uci -q get network.@switch_port[$i].port)
  273. if [ $(($j-$port)) -eq 0 ]; then pvid=$vid; printf "Found pvid $vid for port $port, set as default... "; fi
  274. let i--
  275. done
  276. echo "port $j: pvid $pvid"
  277. port=$j
  278. let "port &= 0x7"
  279. PPB $port; reg=$retval;
  280. readreg $reg
  281. val=$retval
  282. let "val &= 0xfffff000"
  283. let "val |= pvid"
  284. writereg $reg $val
  285. let j++
  286. done
  287.  
  288. #port accept mode
  289. printf "Set access mode: "
  290. for j in $portslist; do
  291. printf "$j "
  292. PVC $j; reg=$retval;
  293. readreg $reg
  294. val=$retval
  295. let "val &= 0xfffffffc"
  296. writereg $reg $val
  297. done
  298. echo "... Done!"
  299.  
  300. switch clear
  301. exit 0;
  302. }
  303.  
  304.  
  305. portlink()
  306. {
  307. num=$1
  308. reg=$(printf "0x3%d08" $num)
  309.  
  310. if [ $(echo $portslist | grep -c $num) -eq 0 ]; then echo "Wrong port number: $num!";exit 1; fi
  311.  
  312. link=0
  313. value=0
  314. detect_ip1001
  315. if [ $(( $retval & ($num == 5) )) -eq 1 ]; then
  316. # P5 is ICPLUS IP1001 gphy
  317. reg=$(( $(mii_mgr -g -p 5 -r 0 | sed -e "s/.* = /0x/gi") ))
  318. reg2=$(( $(mii_mgr -g -p 5 -r 1 | sed -e "s/.* = /0x/gi") ))
  319. reg3=$(( $(mii_mgr -g -p 5 -r 17 | sed -e "s/.* = /0x/gi") ))
  320. speed=$(( ($reg3 >> 13 ) & 3 ))
  321. link=$(( ($reg3 >> 15) & 1 ))
  322. duplex=$(( ($reg3 >> 12) & 1 ))
  323. auto=$(( ($reg2 & (1 << 5)) >> 5 ))
  324. rxflow=0
  325. txflow=0
  326. value=$(($(printf "0x%x%x" $reg $reg3)))
  327. else
  328. #any other mt7530 port
  329. readreg $reg
  330. value=$retval
  331. duplex=$(( $(( $value >> 1 )) & 1 ))
  332. link=$(( $value & 1 ))
  333. speed=$(( $(( $value >> 2 )) & 3 ))
  334. rxflow=$(( $(( $value >> 5 )) & 1 ))
  335. txflow=$(( $(( $value >> 4 )) & 1 ))
  336. auto=0
  337. fi
  338. if [ $speed -eq 0 ]; then speedstr="10baseT";fi
  339. if [ $speed -eq 1 ]; then speedstr="100baseTX";fi
  340. if [ $speed -eq 2 ] || [ $speed -eq 3 ]; then speedstr="1000baseT";fi
  341. if [ "$speedstr" == "" ]; then speedstr="Unknown";fi
  342. rxflowstr="";txflowstr="";
  343. if [ $rxflow -eq 1 ]; then rxflowstr="rxflow "; fi
  344. if [ $txflow -eq 1 ]; then txflowstr="txflow "; fi
  345.  
  346. duplexstr="half-duplex "
  347. if [ $duplex -eq 1 ]; then duplexstr="full-duplex ";fi
  348. if [ $auto -eq 1 ]; then autostr="auto "; else autostr="";fi
  349.  
  350. if [ $link -eq 1 ]; then
  351. 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"
  352. else
  353. printf "Port %d:\n\tlink: port:%d link:down raw:0x%x\n" $num $num $value
  354. fi
  355. }
  356.  
  357. if [ "$1" == "portdump" ] || [ "$3" == "show" ]; then
  358. for i in $portslist; do
  359. portlink $i
  360. echo
  361. done
  362. exit 0;
  363. fi
  364. if [ "$1" == "port" ]; then
  365. portlink $2
  366. exit 0;
  367. fi
  368. if [ "$1" == "init" ]; then
  369. configswitch
  370. exit 0;
  371. fi
  372.  
  373. if [ "$1" == "list" ]; then
  374. echo "Found: switch0 - mt7530"
  375. exit 0;
  376. fi
  377.  
  378. if [ "$1" == "dev" ]; then
  379. #swconfig emu
  380. echo "Found: switch0 - mt7530"
  381. if [ "$3" == "apply" ]; then
  382. configswitch
  383. fi
  384. if [ "$3" == "help" ]; then
  385. if [ $(cat /proc/cpuinfo | head -n1 | grep -c 7620) -eq 1 ]; then
  386. echo "switch0: mt7620(MT7620), ports: 8 (cpu @ 7), vlans: 4096"
  387. else
  388. echo "switch0: mt7530(MT7530), ports: 7 (cpu @ 6), vlans: 4096"
  389. fi
  390. cat << EOF
  391. --switch
  392. Attribute 1 (int): enable_vlan (Enable VLAN mode)
  393. Attribute 2 (int): enable_vlan4k (Enable VLAN 4K mode)
  394. Attribute 3 (none): apply (Activate changes in the hardware)
  395. Attribute 4 (none): reset (Reset the switch)
  396. --vlan
  397. Attribute 1 (string): info (Get vlan information)
  398. Attribute 2 (int): fid (Get/Set vlan FID)
  399. Attribute 3 (ports): ports (VLAN port mapping)
  400. --port
  401. Attribute 1 (string): mib (Get MIB counters for port)
  402. Attribute 2 (int): pvid (Primary VLAN ID)
  403. Attribute 3 (string): link (Get port link information)
  404. EOF
  405. fi
  406. exit 0;
  407. fi
  408. echo "Usage:"
  409. echo "$0 portdump - dumps all ports state"
  410. echo "$0 port n - dumps port 'n' state"
  411. echo "$0 init - init switch"
Advertisement
Add Comment
Please, Sign In to add comment