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