blob: 31173eabf967cfdec105a86ff9089264d861c188 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh /etc/rc.common
2# Copyright (C) 2010-2018 OpenWrt.org
3
4START=40
5
6SET_WLAN="iwpriv wlan1"
7SET_WLAN_PARAM="$SET_WLAN set_mib"
8IFCONFIG=ifconfig
9
10wlan_power_ctrl() {
11 local on=$1
12 local name
13 local power
14 local pcie_device
15
16 for name in $(ls /sys/devices/platform | grep "rfkill"); do
17 [ ! -e "/sys/devices/platform/${name}/pwr_ctrl" ] && continue
18 power=0
19 $(cat /sys/devices/platform/${name}/pwr_ctrl | grep -q on) && power=1
20 [ "$power" == "$on" ] && continue
21 echo $on > /sys/devices/platform/${name}/pwr_ctrl
22 done
23}
24
25rtl8192fr_write_cali() {
26 $SET_WLAN set_mib pwrlevelCCK_A=2828282828282828282828282828
27 $SET_WLAN set_mib pwrlevelCCK_B=2D2D2D2D2D2D2D2D2D2D2D2D2D2D
28 $SET_WLAN set_mib pwrlevelHT40_1S_A=2727272727272727272727272727
29 $SET_WLAN set_mib pwrlevelHT40_1S_B=2A2A2A2A2A2A2A2A2A2A2A2A2A2A
30 $SET_WLAN set_mib pwrdiffOFDM=2828282828282828282828282828
31 $SET_WLAN set_mib xcap=23
32 $SET_WLAN set_mib thermal=35
33
34}
35rtl8812fr_write_cali() {
36 $SET_WLAN set_mib pwrlevel5GHT40_1S_A=00000000000000000000000000000000000000000000000000000000000000000000005A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A54545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454
37 $SET_WLAN set_mib pwrlevel5GHT40_1S_B=00000000000000000000000000000000000000000000000000000000000000000000005A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A54545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454
38 $SET_WLAN set_mib pwrdiff5GHT40_2S=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
39 $SET_WLAN set_mib pwrdiff5GHT20=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
40 $SET_WLAN set_mib pwrdiff5GOFDM=00000000000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
41 $SET_WLAN set_mib pwrlevel_TSSI5GHT40_1S_A=0000000000000000000000000000000000000000000000000000000000000000000000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFAFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFDFDFDFDFDFDFDFDFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFAFAFAFAFAFAFAFAFBFBFBFBFBFBFBFBFCFCFCFCFCFCFCFCFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB
42 $SET_WLAN set_mib pwrlevel_TSSI5GHT40_1S_B=0000000000000000000000000000000000000000000000000000000000000000000000FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFDFDFDFDFDFDFDFDFDFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
43 $SET_WLAN set_mib xcap=32
44 $SET_WLAN set_mib thermal1=33
45 $SET_WLAN set_mib thermal2=32
46}
47rtl_write_cali() {
48 grep -l "RTL8192F" /proc/wlan1/mib_rf > /dev/null
49 if [ $? -eq 0 ]; then
50 rtl8192fr_write_cali
51 fi
52 grep -l "RTL8812" /proc/wlan1/mib_rf > /dev/null
53 if [ $? -eq 0 ]; then
54 rtl8812_write_cali
55 fi
56}
57wlan_ops_lock() {
58 echo mwlan > /sys/power/wake_lock
59}
60
61wlan_ops_unlock() {
62 echo mwlan > /sys/power/wake_unlock
63}
64
65wlan_ubus_event() {
66 case $1 in
67 start )
68 ubus send mwlan.stat.action ' { "stat" : "start" } ' ;;
69 up )
70 ubus send mwlan.stat.action ' { "stat" : "up" } ' ;;
71 down )
72 ubus send mwlan.stat.action ' { "stat" : "down" } ' ;;
73 * )
74 echo "unknown option ($1)" ;;
75 esac
76}
77
78
79wlan_enable_vap() {
80 local _device _disabled _ifname
81
82 _wlan_enable_vap() {
83 config_get _device $1 device
84 config_get _disabled $_device disabled
85 config_get _ifname $1 ifname
86 [ 1 == "$disabled" ] && return
87
88 case $_ifname in
89 *-va[0-9])
90 iwpriv ${_ifname%-va*} set_mib vap_enable=1
91 ;;
92 *)
93 ;;
94 esac
95
96 }
97
98 config_foreach _wlan_enable_vap wifi-iface
99}
100
101find_phy() {
102 [ -n "$path" ] && {
103 for phy in /sys/devices/$path/ieee80211/phy*; do
104 [ -e "$phy" ] && {
105 phy="${phy##*/}"
106 return 0
107 }
108 done
109 }
110 [ -n "$macaddr" ] && {
111 for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
112 grep -i -q "$macaddr" "/sys/class/ieee80211/${phy}/macaddress" && return 0
113 done
114 }
115 return 1
116}
117
118wlan_set_sta_channel_to_ap() {
119 local _device _disabled _ifname _ssid
120 local ap_device=$1 root_ifname=$2 ap_channel=$3 sta_channel=
121 local path macaddr phy
122
123 __wlan_set_sta_channel_to_ap() {
124 config_get _device $1 device
125 config_get _disabled $_device disabled
126 config_get path $_device path
127 config_get _mode $1 mode
128 config_get _ifname $1 ifname
129 config_get _ssid $1 ssid
130 config_get macaddr $1 macaddr
131
132 [ 1 == "$_disabled" ] && return
133 [ "${_mode}" != "sta" ] && return
134 [ "$root_ifname" != "${_ifname%%-v*}" ] && return
135
136 find_phy || {
137 echo "Could not find PHY for device '$_device'"
138 return
139 }
140 for i in $( seq 1 10 ); do
141 iw phy "$phy" interface add "$root_ifname" type station
142 ifconfig "$root_ifname" hw ether "$macaddr"
143 ifconfig "$root_ifname" up 2>/dev/null && {
144 echo "==> $root_ifname is up for scan ssid" > /dev/kmsg
145 break
146 }
147 sleep 1
148 done
149 for i in $( seq 1 10 ); do
150 freq=$(iw dev "$root_ifname" scan ssid "$_ssid" | awk '/freq/{print $2}' | head -1)
151 if [ $freq -ge 2412 -a $freq -le 2472 ]; then
152 sta_channel=$((($freq - 2407)/5))
153 elif [ $freq -eq 2484 ]; then
154 sta_channel=14
155 elif [ $freq -ge 4900 -a $freq -lt 5000 ]; then
156 sta_channel=$((($freq - 4000)/5))
157 else
158 sta_channel=
159 sleep 1
160 echo "==> try $i times to scan ssid $_ssid" > /dev/kmsg
161 continue
162 fi
163 break
164 done
165
166 echo "==> scan $_ssid, get channel = $sta_channel" > /dev/kmsg
167 [ -n "$sta_channel" ] && {
168 [ "$sta_channel" != "$ap_channel" ] && {
169 uci_set wireless $ap_device channel $sta_channel
170 uci_commit wireless
171 echo "==> $ap_device: set channel to $sta_channel" > /dev/kmsg
172 }
173 eval wifichannel_${root_ifname}=\${sta_channel}
174 }
175 }
176
177 eval wifichannel=\${wifichannel_${root_ifname}}
178 [ -n "$wifichannel" ] && {
179 echo "==> already set channel for root interface" > /dev/kmsg
180 [ "$wifichannel" != "$ap_channel" ] && {
181 echo "==> $ap_device: set channel to $wifichannel, same with ${root_ifname}" > /dev/kmsg
182 uci_set wireless $ap_device channel $wifichannel
183 uci_commit wireless
184 }
185 return
186 }
187
188 config_foreach __wlan_set_sta_channel_to_ap wifi-iface
189}
190
191wlan_updown() {
192 local act=up i=1
193 local _device _disabled _ifname _mode _up _isolate _channel
194 local ret
195
196 __wlan_updown() {
197 config_get _device $1 device
198 config_get _ifname $1 ifname
199 config_get _mode $1 mode
200 config_get _isolate $1 isolate
201
202 config_get _channel $_device channel
203 config_get _disabled $_device disabled
204 if [ "$act" == "down" ]; then
205 $(/sbin/wifi status $_device 2>/dev/null | grep -q "\"up\": true") || return
206 /sbin/wifi down $_device
207 elif [ "$act" == "up" -a "$_disabled" != "1" ]; then
208 $(/sbin/wifi status $_device 2>/dev/null | grep -q "\"up\": true") && return
209
210 case $_ifname in
211 *-vxd)
212 iwpriv $_ifname copy_mib
213 ;;
214 *)
215 ;;
216 esac
217 if [ "${_mode}" == "sta" ]; then
218 iwpriv $_ifname set_mib opmode=8
219 else
220 iwpriv $_ifname set_mib opmode=16
221 # AP need to use same channel with STA
222 wlan_set_sta_channel_to_ap $_device ${_ifname%%-v*} $_channel
223 fi
224
225 /sbin/wifi up $_device
226 else
227 return
228 fi
229
230 while [ $i -lt 20 ]
231 do
232 _up=0
233 $(/sbin/wifi status $_device 2>/dev/null | grep -q "\"up\": true") && _up=1
234 if [ "$act" == "down" -a "$_up" == "0" ]; then
235 break;
236 elif [ "$act" == "up" -a "$_up" == "1" ]; then
237 if [ $_mode == "ap" ]; then
238 if [ $_isolate == "1" ]; then
239 iwpriv $_ifname set_mib block_relay=1
240 else
241 iwpriv $_ifname set_mib block_relay=0
242 fi
243 fi
244 break;
245 fi
246 sleep 1
247 i=$(($i+1))
248 done
249 [ "$i" -ge "20" ] && LOGE "wlan_updown $act ${_device} failed" && ret=1
250 }
251
252 ret=0
253 [ "$#" -ge "1" ] && act=$1
254
255 config_load wireless
256
257 [ "$act" == "up" ] && wlan_enable_vap
258 config_foreach __wlan_updown wifi-iface
259 return $ret
260}
261
262start() {
263 wlan_ops_lock
264 wlan_ubus_event start
265 wlan_power_ctrl 1
266 wlan_updown up
267 wlan_ubus_event up
268 wlan_ops_unlock
269}
270
271boot() {
272 wlan_check_wifi_exist() {
273 local _ifname _device
274
275 config_get _device $1 device
276 config_get _disabled $_device disabled
277 config_get _ifname $1 ifname
278
279 if [ $_disabled == "1" ]; then
280 mkdir -p /var/wifi_ok
281 touch /var/wifi_ok/$_device
282 else
283 ifconfig -a | grep -q $_ifname && {
284 mkdir -p /var/wifi_ok
285 touch /var/wifi_ok/$_device
286 }
287 fi
288 }
289
290 start
291 sleep 1
292 config_load wireless
293 config_foreach wlan_check_wifi_exist wifi-iface
294}
295
296stop() {
297 wlan_ops_lock
298 wlan_updown down
299 sleep 1
300 wlan_power_ctrl 0
301 wlan_ubus_event down
302 wlan_ops_unlock
303}
304
305restart() {
306 wlan_ops_lock
307 wlan_power_ctrl 1
308 wlan_updown down
309 wlan_updown up
310 wlan_ops_unlock
311}
312
313reload() {
314 wlan_ops_lock
315 wlan_power_ctrl 1
316 wlan_updown down
317 wlan_updown up
318 wlan_ops_unlock
319}