mac80211: rely on iwinfo for phy->path and path->phy lookups
[openwrt/staging/mkresin.git] / package / kernel / mac80211 / files / lib / wifi / mac80211.sh
1 #!/bin/sh
2
3 append DRIVERS "mac80211"
4
5 lookup_phy() {
6 [ -n "$phy" ] && {
7 [ -d /sys/class/ieee80211/$phy ] && return
8 }
9
10 local devpath
11 config_get devpath "$device" path
12 [ -n "$devpath" ] && {
13 phy="$(iwinfo nl80211 phyname "path=$devpath")"
14 [ -n "$phy" ] && return
15 }
16
17 local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
18 [ -n "$macaddr" ] && {
19 for _phy in /sys/class/ieee80211/*; do
20 [ -e "$_phy" ] || continue
21
22 [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
23 phy="${_phy##*/}"
24 return
25 done
26 }
27 phy=
28 return
29 }
30
31 find_mac80211_phy() {
32 local device="$1"
33
34 config_get phy "$device" phy
35 lookup_phy
36 [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
37 echo "PHY for wifi device $1 not found"
38 return 1
39 }
40 config_set "$device" phy "$phy"
41
42 config_get macaddr "$device" macaddr
43 [ -z "$macaddr" ] && {
44 config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
45 }
46
47 return 0
48 }
49
50 check_mac80211_device() {
51 config_get phy "$1" phy
52 [ -z "$phy" ] && {
53 find_mac80211_phy "$1" >/dev/null || return 0
54 config_get phy "$1" phy
55 }
56 [ "$phy" = "$dev" ] && found=1
57 }
58
59
60 __get_band_defaults() {
61 local phy="$1"
62
63 ( iw phy "$phy" info; echo ) | awk '
64 BEGIN {
65 bands = ""
66 }
67
68 ($1 == "Band" || $1 == "") && band {
69 if (channel) {
70 mode="NOHT"
71 if (ht) mode="HT20"
72 if (vht && band != "1:") mode="VHT80"
73 if (he) mode="HE80"
74 if (he && band == "1:") mode="HE20"
75 sub("\\[", "", channel)
76 sub("\\]", "", channel)
77 bands = bands band channel ":" mode " "
78 }
79 band=""
80 }
81
82 $1 == "Band" {
83 band = $2
84 channel = ""
85 vht = ""
86 ht = ""
87 he = ""
88 }
89
90 $0 ~ "Capabilities:" {
91 ht=1
92 }
93
94 $0 ~ "VHT Capabilities" {
95 vht=1
96 }
97
98 $0 ~ "HE Iftypes" {
99 he=1
100 }
101
102 $1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
103 channel = $4
104 }
105
106 END {
107 print bands
108 }'
109 }
110
111 get_band_defaults() {
112 local phy="$1"
113
114 for c in $(__get_band_defaults "$phy"); do
115 local band="${c%%:*}"
116 c="${c#*:}"
117 local chan="${c%%:*}"
118 c="${c#*:}"
119 local mode="${c%%:*}"
120
121 case "$band" in
122 1) band=2g;;
123 2) band=5g;;
124 3) band=60g;;
125 4) band=6g;;
126 *) band="";;
127 esac
128
129 [ -n "$band" ] || continue
130 [ -n "$mode_band" -a "$band" = "6g" ] && return
131
132 mode_band="$band"
133 channel="$chan"
134 htmode="$mode"
135 done
136 }
137
138 detect_mac80211() {
139 devidx=0
140 config_load wireless
141 while :; do
142 config_get type "radio$devidx" type
143 [ -n "$type" ] || break
144 devidx=$(($devidx + 1))
145 done
146
147 for _dev in /sys/class/ieee80211/*; do
148 [ -e "$_dev" ] || continue
149
150 dev="${_dev##*/}"
151
152 found=0
153 config_foreach check_mac80211_device wifi-device
154 [ "$found" -gt 0 ] && continue
155
156 mode_band=""
157 channel=""
158 htmode=""
159 ht_capab=""
160
161 get_band_defaults "$dev"
162
163 path="$(iwinfo nl80211 path "$dev")"
164 if [ -n "$path" ]; then
165 dev_id="set wireless.radio${devidx}.path='$path'"
166 else
167 dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
168 fi
169
170 uci -q batch <<-EOF
171 set wireless.radio${devidx}=wifi-device
172 set wireless.radio${devidx}.type=mac80211
173 ${dev_id}
174 set wireless.radio${devidx}.channel=${channel}
175 set wireless.radio${devidx}.band=${mode_band}
176 set wireless.radio${devidx}.htmode=$htmode
177 set wireless.radio${devidx}.disabled=1
178
179 set wireless.default_radio${devidx}=wifi-iface
180 set wireless.default_radio${devidx}.device=radio${devidx}
181 set wireless.default_radio${devidx}.network=lan
182 set wireless.default_radio${devidx}.mode=ap
183 set wireless.default_radio${devidx}.ssid=OpenWrt
184 set wireless.default_radio${devidx}.encryption=none
185 EOF
186 uci -q commit wireless
187
188 devidx=$(($devidx + 1))
189 done
190 }