mac80211: add support for multiple wiphys behind a single device
[openwrt/staging/luka.git] / package / kernel / mac80211 / files / lib / wifi / mac80211.sh
1 #!/bin/sh
2 . /lib/netifd/mac80211.sh
3
4 append DRIVERS "mac80211"
5
6 lookup_phy() {
7 [ -n "$phy" ] && {
8 [ -d /sys/class/ieee80211/$phy ] && return
9 }
10
11 local devpath
12 config_get devpath "$device" path
13 [ -n "$devpath" ] && {
14 phy="$(mac80211_path_to_phy "$devpath")"
15 [ -n "$phy" ] && return
16 }
17
18 local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
19 [ -n "$macaddr" ] && {
20 for _phy in /sys/class/ieee80211/*; do
21 [ -e "$_phy" ] || continue
22
23 [ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
24 phy="${_phy##*/}"
25 return
26 done
27 }
28 phy=
29 return
30 }
31
32 find_mac80211_phy() {
33 local device="$1"
34
35 config_get phy "$device" phy
36 lookup_phy
37 [ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
38 echo "PHY for wifi device $1 not found"
39 return 1
40 }
41 config_set "$device" phy "$phy"
42
43 config_get macaddr "$device" macaddr
44 [ -z "$macaddr" ] && {
45 config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
46 }
47
48 return 0
49 }
50
51 check_mac80211_device() {
52 config_get phy "$1" phy
53 [ -z "$phy" ] && {
54 find_mac80211_phy "$1" >/dev/null || return 0
55 config_get phy "$1" phy
56 }
57 [ "$phy" = "$dev" ] && found=1
58 }
59
60 detect_mac80211() {
61 devidx=0
62 config_load wireless
63 while :; do
64 config_get type "radio$devidx" type
65 [ -n "$type" ] || break
66 devidx=$(($devidx + 1))
67 done
68
69 for _dev in /sys/class/ieee80211/*; do
70 [ -e "$_dev" ] || continue
71
72 dev="${_dev##*/}"
73
74 found=0
75 config_foreach check_mac80211_device wifi-device
76 [ "$found" -gt 0 ] && continue
77
78 mode_band="g"
79 channel="11"
80 htmode=""
81 ht_capab=""
82
83 iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20
84
85 iw phy "$dev" info | grep -q '5180 MHz' && {
86 mode_band="a"
87 channel="36"
88 iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
89 }
90
91 [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
92
93 path="$(mac80211_phy_to_path "$dev")"
94 if [ -n "$path" ]; then
95 dev_id="set wireless.radio${devidx}.path='$path'"
96 else
97 dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
98 fi
99
100 uci -q batch <<-EOF
101 set wireless.radio${devidx}=wifi-device
102 set wireless.radio${devidx}.type=mac80211
103 set wireless.radio${devidx}.channel=${channel}
104 set wireless.radio${devidx}.hwmode=11${mode_band}
105 ${dev_id}
106 ${ht_capab}
107 set wireless.radio${devidx}.disabled=1
108
109 set wireless.default_radio${devidx}=wifi-iface
110 set wireless.default_radio${devidx}.device=radio${devidx}
111 set wireless.default_radio${devidx}.network=lan
112 set wireless.default_radio${devidx}.mode=ap
113 set wireless.default_radio${devidx}.ssid=OpenWrt
114 set wireless.default_radio${devidx}.encryption=none
115 EOF
116 uci -q commit wireless
117
118 devidx=$(($devidx + 1))
119 done
120 }