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
