b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | #!/bin/sh /etc/rc.common |
| 2 | # Copyright (C) 2010-2018 OpenWrt.org |
| 3 | |
| 4 | START=40 |
| 5 | |
| 6 | SET_WLAN="iwpriv wlan1" |
| 7 | SET_WLAN_PARAM="$SET_WLAN set_mib" |
| 8 | IFCONFIG=ifconfig |
| 9 | |
| 10 | wlan_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 | |
| 25 | rtl8192fr_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 | } |
| 35 | rtl8812fr_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 | } |
| 47 | rtl_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 | } |
| 57 | wlan_ops_lock() { |
| 58 | echo mwlan > /sys/power/wake_lock |
| 59 | } |
| 60 | |
| 61 | wlan_ops_unlock() { |
| 62 | echo mwlan > /sys/power/wake_unlock |
| 63 | } |
| 64 | |
| 65 | wlan_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 | |
| 79 | wlan_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 | |
| 101 | find_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 | |
| 118 | wlan_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 | |
| 191 | wlan_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 | |
| 262 | start() { |
| 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 | |
| 271 | boot() { |
| 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 | |
| 296 | stop() { |
| 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 | |
| 305 | restart() { |
| 306 | wlan_ops_lock |
| 307 | wlan_power_ctrl 1 |
| 308 | wlan_updown down |
| 309 | wlan_updown up |
| 310 | wlan_ops_unlock |
| 311 | } |
| 312 | |
| 313 | reload() { |
| 314 | wlan_ops_lock |
| 315 | wlan_power_ctrl 1 |
| 316 | wlan_updown down |
| 317 | wlan_updown up |
| 318 | wlan_ops_unlock |
| 319 | } |