Since the ath10k driver is getting along nicely, I reckon its time to
get proper
802.11ac support to OpenWrt. This patch introduces 802.11ac support to
base-files,
mac80211 and hostapd. Since the changes overall are rather small, I
decided to
put everything in a single patch. Let me know if you prefer this to be
split up.
The patch introduces a new hwmode "11acna" to the uci wireless
configuration file.
It is a bit superfluous, since ac implies n and a, but this was the
approach that
to me seemed to involve least changes. Also, I didn't yet include
support for
VHT160 split in two 80 MHz bands, since it requires an additional user
supplied
parameter for the channel of the second band. I'm also not sure if ACS
support in
hostapd is required for ac-support, but I included it anyway. Finally,
actually
using 80 MHz channels requires a new regulatory database, which comes when
compat-wireless is updated (not included here).

v2: fix mangled whitespaces

Signed-off-by: Matti Laakso <[email protected]>
---

Index: package/base-files/files/sbin/wifi
===================================================================
--- package/base-files/files/sbin/wifi  (revision 38795)
+++ package/base-files/files/sbin/wifi  (working copy)
@@ -62,7 +62,7 @@
 wifi_fixup_hwmode() {
        local device="$1"
        local default="$2"
-       local hwmode hwmode_11n
+       local hwmode hwmode_11n hwmode_11ac
 
        config_get channel "$device" channel
        config_get hwmode "$device" hwmode
@@ -79,6 +79,12 @@
                        esac
                        config_set "$device" hwmode_11n "$hwmode_11n"
                ;;
+               11ac*)
+                       hwmode_11n=a
+                       hwmode_11ac=a
+                       config_set "$device" hwmode_11n "$hwmode_11n"
+                       config_set "$device" hwmode_11ac "$hwmode_11ac"
+               ;;
                *)
                        hwmode=
                        if [ "${channel:-0}" -gt 0 ]; then 
Index: package/kernel/mac80211/files/lib/wifi/mac80211.sh
===================================================================
--- package/kernel/mac80211/files/lib/wifi/mac80211.sh  (revision 38795)
+++ package/kernel/mac80211/files/lib/wifi/mac80211.sh  (working copy)
@@ -41,6 +41,50 @@
                        done
                        [ -n "$ht_capab" ] && append base_cfg 
"ht_capab=$ht_capab" "$N"
                }
+               config_get hwmode_11ac "$device" hwmode_11ac
+               [ -n "$hwmode_11ac" ] && {
+                       hwmode="$hwmode_11ac"
+                       append base_cfg "ieee80211ac=1" "$N"
+                       config_get htmode "$device" htmode
+                       config_get vhtmode "$device" vhtmode
+                       config_get vht_capab_list "$device" vht_capab
+                       idx="$channel"
+                       case "$vhtmode" in
+                               VHT80)
+                                       case "$channel" in
+                                               36|40|44|48) idx=42;;
+                                               52|56|60|64) idx=58;;
+                                               100|104|108|112) idx=106;;
+                                               116|120|124|128) idx=122;;
+                                               132|136|140|144) idx=138;;
+                                               149|153|157|161) idx=155;;
+                                       esac
+                                       append base_cfg "vht_oper_chwidth=1" 
"$N"
+                                       append base_cfg 
"vht_oper_centr_freq_seg0_idx=$idx" "$N"
+                               ;;
+                               VHT160)
+                                       case "$channel" in
+                                               36|40|44|48|52|56|60|64) 
idx=50;;
+                                               
100|104|108|112|116|120|124|128) idx=114;;
+                                       esac
+                                       append base_cfg "vht_oper_chwidth=2" 
"$N"
+                                       append base_cfg 
"vht_oper_centr_freq_seg0_idx=$idx" "$N"
+                               ;;
+                               *)
+                                       case "$htmode" in
+                                               HT20) ;;
+                                               HT40+) idx=$((idx+2));;
+                                               HT40-) idx=$((idx-2));;
+                                       esac
+                                       append base_cfg "vht_oper_chwidth=0" 
"$N"
+                                       append base_cfg 
"vht_oper_centr_freq_seg0_idx=$idx" "$N"
+                               ;;
+                       esac
+                       for cap in $vht_capab_list; do
+                               vht_capab="$vht_capab[$cap]"
+                       done
+                       [ -n "$vht_capab" ] && append base_cfg 
"vht_capab=$vht_capab" "$N"
+               }
        }
 
        local country_ie=0
@@ -602,6 +646,7 @@
                [ "$found" -gt 0 ] && continue
 
                mode_11n=""
+               mode_11ac=""
                mode_band="g"
                channel="11"
                ht_cap=0
@@ -624,6 +669,40 @@
                        [ "$(($ht_cap & 768))" -eq 768 ] && append ht_capab 
"$list      RX-STBC123" "$N"
                        [ "$(($ht_cap & 4096))" -eq 4096 ] && append ht_capab 
"$list    DSSS_CCK-40" "$N"
                }
+               vht_cap=0
+               for cap in $(iw phy "$dev" info | awk -F "[()]" '/VHT 
Capabilities/ { print $2 }'); do
+                       vht_cap="$(($vht_cap | $cap))"
+               done
+               vht_capab="";
+               [ "$vht_cap" -gt 0 ] && {
+                       mode_11ac="ac"
+                       append vht_capab "      option vhtmode  VHT80" "$N"
+                       
+                       list="  list vht_capab"
+                       [ "$(($vht_cap & 3))" -eq 1 ] && append vht_capab 
"$list        MAX-MPDU-7991" "$N"
+                       [ "$(($vht_cap & 3))" -eq 2 ] && append vht_capab 
"$list        MAX-MPDU-11454" "$N"
+                       [ "$(($vht_cap & 12))" -eq 4 ] && append vht_capab 
"$list       VHT160" "$N"
+                       [ "$(($vht_cap & 12))" -eq 8 ] && append vht_capab 
"$list       VHT160-80PLUS80" "$N"
+                       [ "$(($vht_cap & 16))" -eq 16 ] && append vht_capab 
"$list      RXLDPC" "$N"
+                       [ "$(($vht_cap & 32))" -eq 32 ] && append vht_capab 
"$list      SHORT-GI-80" "$N"
+                       [ "$(($vht_cap & 64))" -eq 64 ] && append vht_capab 
"$list      SHORT-GI-160" "$N"
+                       [ "$(($vht_cap & 128))" -eq 128 ] && append vht_capab 
"$list    TX-STBC-2BY1" "$N"
+                       [ "$(($vht_cap & 1792))" -eq 256 ] && append vht_capab 
"$list   RX-STBC-1" "$N"
+                       [ "$(($vht_cap & 1792))" -eq 512 ] && append vht_capab 
"$list   RX-STBC-12" "$N"
+                       [ "$(($vht_cap & 1792))" -eq 768 ] && append vht_capab 
"$list   RX-STBC-123" "$N"
+                       [ "$(($vht_cap & 1792))" -eq 1024 ] && append vht_capab 
"$list  RX-STBC-1234" "$N"
+                       [ "$(($vht_cap & 2048))" -eq 2048 ] && append vht_capab 
"$list  SU-BEAMFORMER" "$N"
+                       [ "$(($vht_cap & 4096))" -eq 4096 ] && append vht_capab 
"$list  SU-BEAMFORMEE" "$N"
+                       [ "$(($vht_cap & 524288))" -eq 524288 ] && append 
vht_capab "$list      MU-BEAMFORMER" "$N"
+                       [ "$(($vht_cap & 1048576))" -eq 1048576 ] && append 
vht_capab "$list    MU-BEAMFORMEE" "$N"
+                       [ "$(($vht_cap & 2097152))" -eq 2097152 ] && append 
vht_capab "$list    VHT-TXOP-PS" "$N"
+                       [ "$(($vht_cap & 4194304))" -eq 4194304 ] && append 
vht_capab "$list    HTC-VHT" "$N"
+                       [ "$(($vht_cap & 201326592))" -eq 134217728 ] && append 
vht_capab "$list        VHT-LINK-ADAPT2" "$N"
+                       [ "$(($vht_cap & 201326592))" -eq 201326592 ] && append 
vht_capab "$list        VHT-LINK-ADAPT3" "$N"
+                       [ "$(($vht_cap & 268435456))" -eq 268435456 ] && append 
vht_capab "$list        RX-ANTENNA-PATTERN" "$N"
+                       [ "$(($vht_cap & 536870912))" -eq 536870912 ] && append 
vht_capab "$list        TX-ANTENNA-PATTERN" "$N"
+               }
+               
                iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; 
channel="36"; }
 
                if [ -x /usr/bin/readlink ]; then
@@ -638,9 +717,10 @@
 config wifi-device  radio$devidx
        option type     mac80211
        option channel  ${channel}
-       option hwmode   11${mode_11n}${mode_band}
+       option hwmode   11${mode_11ac}${mode_11n}${mode_band}
 $dev_id
 $ht_capab
+$vht_capab
        # REMOVE THIS LINE TO ENABLE WIFI:
        option disabled 1
 
Index: package/network/services/hostapd/files/hostapd-full.config
===================================================================
--- package/network/services/hostapd/files/hostapd-full.config  (revision 38795)
+++ package/network/services/hostapd/files/hostapd-full.config  (working copy)
@@ -139,6 +139,9 @@
 # IEEE 802.11n (High Throughput) support
 CONFIG_IEEE80211N=y
 
+# IEEE 802.11ac (Very High Throughput) support
+CONFIG_IEEE80211AC=y
+
 # Remove debugging code that is printing out debug messages to stdout.
 # This can be used to reduce the size of the hostapd considerably if debugging
 # code is not needed.
@@ -163,4 +166,28 @@
 CONFIG_WPS=y
 CONFIG_FULL_DYNAMIC_VLAN=y
 
+# Automatic Channel Selection
+# This will allow hostapd to pick the channel automatically when channel is set
+# to "acs_survey" or "0". Eventually, other ACS algorithms can be added in
+# similar way.
+#
+# Automatic selection is currently only done through initialization, later on
+# we hope to do background checks to keep us moving to more ideal channels as
+# time goes by. ACS is currently only supported through the nl80211 driver and
+# your driver must have survey dump capability that is filled by the driver
+# during scanning.
+#
+# You can customize the ACS survey algorithm with the hostapd.conf variable
+# acs_num_scans.
+#
+# Supported ACS drivers:
+# * ath9k
+# * ath5k
+# * ath10k
+#
+# For more details refer to:
+# http://wireless.kernel.org/en/users/Documentation/acs
+#
+CONFIG_ACS=y
+
 CONFIG_UBUS=y
Index: package/network/services/hostapd/files/hostapd-mini.config
===================================================================
--- package/network/services/hostapd/files/hostapd-mini.config  (revision 38795)
+++ package/network/services/hostapd/files/hostapd-mini.config  (working copy)
@@ -138,6 +138,9 @@
 # IEEE 802.11n (High Throughput) support
 CONFIG_IEEE80211N=y
 
+# IEEE 802.11ac (Very High Throughput) support
+CONFIG_IEEE80211AC=y
+
 # Remove debugging code that is printing out debug messages to stdout.
 # This can be used to reduce the size of the hostapd considerably if debugging
 # code is not needed.
@@ -156,4 +159,28 @@
 
 CONFIG_NO_DUMP_STATE=y
 
+# Automatic Channel Selection
+# This will allow hostapd to pick the channel automatically when channel is set
+# to "acs_survey" or "0". Eventually, other ACS algorithms can be added in
+# similar way.
+#
+# Automatic selection is currently only done through initialization, later on
+# we hope to do background checks to keep us moving to more ideal channels as
+# time goes by. ACS is currently only supported through the nl80211 driver and
+# your driver must have survey dump capability that is filled by the driver
+# during scanning.
+#
+# You can customize the ACS survey algorithm with the hostapd.conf variable
+# acs_num_scans.
+#
+# Supported ACS drivers:
+# * ath9k
+# * ath5k
+# * ath10k
+#
+# For more details refer to:
+# http://wireless.kernel.org/en/users/Documentation/acs
+#
+CONFIG_ACS=y
+
 CONFIG_UBUS=y
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to