mac80211: rework default config script
authorFelix Fietkau <nbd@nbd.name>
Mon, 24 May 2021 12:56:02 +0000 (14:56 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 26 May 2021 09:48:14 +0000 (11:48 +0200)
Emit the new band option instead of hwmode
Support 6 GHz band and HE options

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/mac80211/files/lib/wifi/mac80211.sh

index 3e99f066934676259bf9cecb30538699fc51c558..0763da8fd813e880f848bcd389d29a2387eeedde 100644 (file)
@@ -57,6 +57,85 @@ check_mac80211_device() {
        [ "$phy" = "$dev" ] && found=1
 }
 
+
+__get_band_defaults() {
+       local phy="$1"
+
+       ( iw phy "$phy" info; echo ) | awk '
+BEGIN {
+        bands = ""
+}
+
+($1 == "Band" || $1 == "") && band {
+        if (channel) {
+               mode="NOHT"
+               if (ht) mode="HT20"
+               if (vht) mode="VHT80"
+               if (he) mode="HE80"
+               if (he && band == "1:") mode="HE20"
+                sub("\\[", "", channel)
+                sub("\\]", "", channel)
+                bands = bands band channel ":" mode " "
+        }
+        band=""
+}
+
+$1 == "Band" {
+        band = $2
+        channel = ""
+       vht = ""
+       ht = ""
+       he = ""
+}
+
+$0 ~ "Capabilities:" {
+       ht=1
+}
+
+$0 ~ "VHT Capabilities:" {
+       vht=1
+}
+
+$0 ~ "HE Iftypes" {
+       he=1
+}
+
+$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
+        channel = $4
+}
+
+END {
+        print bands
+}'
+}
+
+get_band_defaults() {
+       local phy="$1"
+
+       for c in $(__get_band_defaults "$phy"); do
+               local band="${c%%:*}"
+               c="${c#*:}"
+               local chan="${c%%:*}"
+               c="${c#*:}"
+               local mode="${c%%:*}"
+
+               case "$band" in
+                       1) band=2g;;
+                       2) band=5g;;
+                       3) band=60g;;
+                       4) band=6g;;
+                       *) band="";;
+               esac
+
+               [ -n "$band" ] || continue
+               [ -n "$mode_band" -a "$band" = "6g" ] && return
+
+               mode_band="$band"
+               channel="$chan"
+               htmode="$mode"
+       done
+}
+
 detect_mac80211() {
        devidx=0
        config_load wireless
@@ -75,26 +154,12 @@ detect_mac80211() {
                config_foreach check_mac80211_device wifi-device
                [ "$found" -gt 0 ] && continue
 
-               mode_band="g"
-               channel="11"
+               mode_band=""
+               channel=""
                htmode=""
                ht_capab=""
 
-               iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20
-
-               iw phy "$dev" info | grep -q '\* 5... MHz \[' && {
-                       mode_band="a"
-                       channel=$(iw phy "$dev" info | grep '\* 5... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\].*//g')
-                       iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
-               }
-
-               iw phy "$dev" info | grep -q '\* 5.... MHz \[' && {
-                       mode_band="ad"
-                       channel=$(iw phy "$dev" info | grep '\* 5.... MHz \[' | grep '(disabled)' -v -m 1 | sed 's/[^[]*\[\|\|\].*//g')
-                       iw phy "$dev" info | grep -q 'Capabilities:' && htmode="HT20"
-               }
-
-               [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
+               get_band_defaults "$dev"
 
                path="$(mac80211_phy_to_path "$dev")"
                if [ -n "$path" ]; then
@@ -106,10 +171,10 @@ detect_mac80211() {
                uci -q batch <<-EOF
                        set wireless.radio${devidx}=wifi-device
                        set wireless.radio${devidx}.type=mac80211
-                       set wireless.radio${devidx}.channel=${channel}
-                       set wireless.radio${devidx}.hwmode=11${mode_band}
                        ${dev_id}
-                       ${ht_capab}
+                       set wireless.radio${devidx}.channel=${channel}
+                       set wireless.radio${devidx}.band=${mode_band}
+                       set wireless.radio${devidx}.htmode=$htmode
                        set wireless.radio${devidx}.disabled=1
 
                        set wireless.default_radio${devidx}=wifi-iface