From 386eca1f655e8896d8eaaef43d12df3a24ecf2d7 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 2 Jun 2022 09:17:24 +0200 Subject: [PATCH] wifi-ax: revert all ath11.5 changes Fixes: WIFI-7570 Signed-off-by: John Crispin --- feeds/wifi-ax/ath11k-wifi/Makefile | 24 -- .../board-2-motorol-q14.bin.QCN6122 | Bin 262292 -> 0 bytes .../ath11k-wifi/board-gl-axt1800.bin.IPQ6018 | Bin 787208 -> 0 bytes .../ath11k-wifi/board-motorol-q14.bin.IPQ5018 | Bin 131072 -> 0 bytes feeds/wifi-ax/batman-adv/Config.in | 88 ++++ feeds/wifi-ax/batman-adv/Makefile | 91 +++++ .../etc/uci-defaults/99-migrate-batadv_hardif | 97 +++++ .../files/lib/netifd/proto/batadv.sh | 123 ++++++ .../files/lib/netifd/proto/batadv_hardif.sh | 53 +++ .../files/lib/netifd/proto/batadv_vlan.sh | 25 ++ ...v-genetlink-move-to-smaller-ops-wher.patch | 128 ++++++ ...v-Add-new-include-for-min-max-helper.patch | 116 ++++++ ...uild-of-multicast-code-against-Linux.patch | 34 ++ ...ays-send-iface-index-name-in-genlmsg.patch | 111 +++++ ...-Avoid-WARN_ON-timing-related-checks.patch | 31 ++ .../0006-batman-adv-fix-error-handling.patch | 162 ++++++++ ...-netlink-usage-in-unprivileged-conta.patch | 182 +++++++++ ...-don-t-send-link-local-multicast-to-.patch | 165 ++++++++ ...atman-adv-Migrate-to-linux-prandom.h.patch | 56 +++ feeds/wifi-ax/batman-adv/src/compat-hacks.h | 125 ++++++ feeds/wifi-ax/batman-adv/src/compat-qca.h | 216 ++++++++++ .../mac80211/patches/pending/999-compat.patch | 13 - .../qca/321-001-qgic-api-compile-fix.patch | 382 ------------------ ...02-ath11k-use-gic-api-irq-allocation.patch | 349 ---------------- ...ain-debugfs-during-firmware-recovery.patch | 381 ----------------- 25 files changed, 1803 insertions(+), 1149 deletions(-) delete mode 100644 feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 delete mode 100644 feeds/wifi-ax/ath11k-wifi/board-gl-axt1800.bin.IPQ6018 delete mode 100644 feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 create mode 100644 feeds/wifi-ax/batman-adv/Config.in create mode 100644 feeds/wifi-ax/batman-adv/Makefile create mode 100755 feeds/wifi-ax/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif create mode 100755 feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv.sh create mode 100755 feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_hardif.sh create mode 100755 feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_vlan.sh create mode 100644 feeds/wifi-ax/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0005-batman-adv-Avoid-WARN_ON-timing-related-checks.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0006-batman-adv-fix-error-handling.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0007-batman-adv-allow-netlink-usage-in-unprivileged-conta.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/0008-batman-adv-mcast-don-t-send-link-local-multicast-to-.patch create mode 100644 feeds/wifi-ax/batman-adv/patches/9005-Revert-batman-adv-Migrate-to-linux-prandom.h.patch create mode 100644 feeds/wifi-ax/batman-adv/src/compat-hacks.h create mode 100644 feeds/wifi-ax/batman-adv/src/compat-qca.h delete mode 100644 feeds/wifi-ax/mac80211/patches/pending/999-compat.patch delete mode 100644 feeds/wifi-ax/mac80211/patches/qca/321-001-qgic-api-compile-fix.patch delete mode 100644 feeds/wifi-ax/mac80211/patches/qca/321-002-ath11k-use-gic-api-irq-allocation.patch delete mode 100644 feeds/wifi-ax/mac80211/patches/qca/342-ath11k-retain-debugfs-during-firmware-recovery.patch diff --git a/feeds/wifi-ax/ath11k-wifi/Makefile b/feeds/wifi-ax/ath11k-wifi/Makefile index a99ed5dc0..10f407f3c 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -32,7 +32,6 @@ ALLWIFIBOARDS:= \ cybertan-eww622-a1 \ edgecore-eap101 \ gl-ax1800 \ - gl-axt1800 \ sercomm-wallaby \ edgecore-eap102 \ edgecore-eap104 \ @@ -87,16 +86,6 @@ $(call Package/ath11k-wifi-default) TITLE:=gl-ax1800 bdf endef -define Package/ath11k-wifi-gl-axt1800 -$(call Package/ath11k-wifi-default) - TITLE:=gl-axt1800 bdf -endef - -define Package/ath11k-wifi-motorola-q14 -$(call Package/ath11k-wifi-default) - TITLE:=motorola q14 bdf -endef - define ath11k-wifi-install-one-to $(INSTALL_DIR) $(2)/lib/firmware/$(3)/ $(INSTALL_DATA) $(1) $(2)/lib/firmware/$(3)/board.bin @@ -184,18 +173,6 @@ define Package/ath11k-wifi-gl-ax1800/install $(INSTALL_DATA) ./board-gl-ax1800.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board-2.bin endef -define Package/ath11k-wifi-gl-axt1800/install - $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/ - $(INSTALL_DATA) ./board-gl-axt1800.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board-2.bin -endef - -define Package/ath11k-wifi-motorola-q14/install - $(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/ - $(INSTALL_DIR) $(1)/lib/firmware/ath11k/qcn6122/hw1.0/ - $(INSTALL_DATA) ./board-motorol-q14.bin.IPQ5018 $(1)/lib/firmware/ath11k/IPQ5018/hw1.0/board.bin - $(INSTALL_DATA) ./board-2-motorol-q14.bin.QCN6122 $(1)/lib/firmware/ath11k/qcn6122/hw1.0/board-2.bin -endef - $(eval $(call generate-ath11k-wifi-package,cig-wf188,Cigtech WF188)) $(eval $(call generate-ath11k-wifi-package,cig-wf188n,Cigtech WF188n)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c)) @@ -219,4 +196,3 @@ $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074)) $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018)) $(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000)) $(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g)) -$(eval $(call BuildPackage,ath11k-wifi-motorola-q14)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 b/feeds/wifi-ax/ath11k-wifi/board-2-motorol-q14.bin.QCN6122 deleted file mode 100644 index 75d77130bc51b7594ad2d5908ded4ab7f0faf499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262292 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

J{P?! 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 BM-2b~ diff --git a/feeds/wifi-ax/ath11k-wifi/board-gl-axt1800.bin.IPQ6018 b/feeds/wifi-ax/ath11k-wifi/board-gl-axt1800.bin.IPQ6018 deleted file mode 100644 index 38df1592ac307c9a3576eb333e5da64370137424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 787208 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�PGEB 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 Mqykcb;S~7)0R(CGkpKVy diff --git a/feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 b/feeds/wifi-ax/ath11k-wifi/board-motorol-q14.bin.IPQ5018 deleted file mode 100644 index 5f5924b0359ca0bada5035355fc5f97260782d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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 +PKG_LICENSE:=GPL-2.0-only MIT +PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT + +STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h + +include $(INCLUDE_DIR)/kernel.mk +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/batman-adv + SUBMENU:=Network Support + TITLE:=B.A.T.M.A.N. Adv + URL:=https://www.open-mesh.org/ + DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl + FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX) + AUTOLOAD:=$(call AutoProbe,batman-adv) +endef + +define KernelPackage/batman-adv/description + B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is + a routing protocol for multi-hop ad-hoc mesh networks. The + networks may be wired or wireless. See + https://www.open-mesh.org/ for more information and user space + tools. This package builds version $(PKG_VERSION) of the kernel + module. +endef + +define KernelPackage/batman-adv/config + source "$(SOURCE)/Config.in" +endef + +define Package/kmod-batman-adv/conffiles +/etc/config/batman-adv +endef + +PKG_EXTRA_KCONFIG:= \ + CONFIG_BATMAN_ADV=m \ + CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \ + CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \ + CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \ + CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \ + CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \ + CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \ + CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \ + +PKG_EXTRA_CFLAGS:= \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \ + $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \ + +NOSTDINC_FLAGS = \ + $(KERNEL_NOSTDINC_FLAGS) \ + -I$(PKG_BUILD_DIR)/net/batman-adv \ + -I$(STAGING_DIR)/usr/include/mac80211-backport \ + -I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \ + -I$(STAGING_DIR)/usr/include/mac80211 \ + -I$(STAGING_DIR)/usr/include/mac80211/uapi \ + -I$(PKG_BUILD_DIR)/include/ \ + -include backport/autoconf.h \ + -include backport/backport.h \ + -include $(PKG_BUILD_DIR)/compat-hacks.h \ + -include $(PKG_BUILD_DIR)/compat-qca.h \ + -DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\" + +define Build/Compile + $(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \ + $(KERNEL_MAKE_FLAGS) \ + M="$(PKG_BUILD_DIR)/net/batman-adv" \ + $(PKG_EXTRA_KCONFIG) \ + EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \ + NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \ + modules +endef + +define KernelPackage/batman-adv/install + $(CP) ./files/. $(1)/ +endef + +$(eval $(call KernelPackage,batman-adv)) diff --git a/feeds/wifi-ax/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif b/feeds/wifi-ax/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif new file mode 100755 index 000000000..258b7bd6a --- /dev/null +++ b/feeds/wifi-ax/batman-adv/files/etc/uci-defaults/99-migrate-batadv_hardif @@ -0,0 +1,97 @@ +#!/bin/sh + +# This UCI-Defaults script will split the batadv proto network interfaces +# in batadv_hardif and batadv proto. The configuration options from +# /etc/config/batman-adv will be moved to the latter. + +. /lib/functions.sh + +proto_batadv_to_batadv_hardif() { + local section="$1" + local proto + local mesh + local routing_algo + + config_get proto "${section}" proto + config_get mesh "${section}" mesh + config_get routing_algo "${section}" routing_algo + + if [ -z "$mesh" -o "${proto}" != "batadv" ]; then + continue + fi + + uci set network."${section}".proto="batadv_hardif" + uci rename network."${section}".mesh="master" + uci delete network."${section}".routing_algo + + # create new section or adjust existing one + uci set network."${mesh}"=interface + uci set network."${mesh}".proto=batadv + [ -n "${routing_algo}" ] && uci set network."${mesh}".routing_algo="${routing_algo}" +} + +mv_batadv_config_section() { + local section="$1" + local aggregated_ogms + local ap_isolation + local bonding + local bridge_loop_avoidance + local distributed_arp_table + local fragmentation + local gw_bandwidth + local gw_mode + local gw_sel_class + local hop_penalty + local isolation_mark + local log_level + local multicast_mode + local network_coding + local orig_interval + + config_get aggregated_ogms "${section}" aggregated_ogms + config_get ap_isolation "${section}" ap_isolation + config_get bonding "${section}" bonding + config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance + config_get distributed_arp_table "${section}" distributed_arp_table + config_get fragmentation "${section}" fragmentation + config_get gw_bandwidth "${section}" gw_bandwidth + config_get gw_mode "${section}" gw_mode + config_get gw_sel_class "${section}" gw_sel_class + config_get hop_penalty "${section}" hop_penalty + config_get isolation_mark "${section}" isolation_mark + config_get log_level "${section}" log_level + config_get multicast_mode "${section}" multicast_mode + config_get network_coding "${section}" network_coding + config_get orig_interval "${section}" orig_interval + + # update section in case it exists + [ -n "${aggregated_ogms}" ] && uci set network."${section}".aggregated_ogms="${aggregated_ogms}" + [ -n "${ap_isolation}" ] && uci set network."${section}".ap_isolation="${ap_isolation}" + [ -n "${bonding}" ] && uci set network."${section}".bonding="${bonding}" + [ -n "${bridge_loop_avoidance}" ] && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}" + [ -n "${distributed_arp_table}" ] && uci set network."${section}".distributed_arp_table="${distributed_arp_table}" + [ -n "${fragmentation}" ] && uci set network."${section}".fragmentation="${fragmentation}" + [ -n "${gw_bandwidth}" ] && uci set network."${section}".gw_bandwidth="${gw_bandwidth}" + [ -n "${gw_mode}" ] && uci set network."${section}".gw_mode="${gw_mode}" + [ -n "${gw_sel_class}" ] && uci set network."${section}".gw_sel_class="${gw_sel_class}" + [ -n "${hop_penalty}" ] && uci set network."${section}".hop_penalty="${hop_penalty}" + [ -n "${isolation_mark}" ] && uci set network."${section}".isolation_mark="${isolation_mark}" + [ -n "${log_level}" ] && uci set network."${section}".log_level="${log_level}" + [ -n "${multicast_mode}" ] && uci set network."${section}".multicast_mode="${multicast_mode}" + [ -n "${network_coding}" ] && uci set network."${section}".network_coding="${network_coding}" + [ -n "${orig_interval}" ] && uci set network."${section}".orig_interval="${orig_interval}" +} + +if [ -f /etc/config/batman-adv ]; then + config_load network + config_foreach proto_batadv_to_batadv_hardif 'interface' + uci commit network + + config_load batman-adv + config_foreach mv_batadv_config_section 'mesh' + uci commit network + + rm -f /etc/config/batman-adv +fi + +exit 0 diff --git a/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv.sh b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv.sh new file mode 100755 index 000000000..edc14f4cb --- /dev/null +++ b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv.sh @@ -0,0 +1,123 @@ +#!/bin/sh + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + init_proto "$@" +} + +proto_batadv_init_config() { + no_device=1 + available=1 + + proto_config_add_boolean 'aggregated_ogms:bool' + proto_config_add_boolean 'ap_isolation:bool' + proto_config_add_boolean 'bonding:bool' + proto_config_add_boolean 'bridge_loop_avoidance:bool' + proto_config_add_boolean 'distributed_arp_table:bool' + proto_config_add_boolean 'fragmentation:bool' + proto_config_add_string 'gw_bandwidth' + proto_config_add_string 'gw_mode' + proto_config_add_int 'gw_sel_class' + proto_config_add_int 'hop_penalty' + proto_config_add_string 'isolation_mark' + proto_config_add_string 'log_level' + proto_config_add_int 'multicast_fanout' + proto_config_add_boolean 'multicast_mode:bool' + proto_config_add_boolean 'network_coding:bool' + proto_config_add_int 'orig_interval' + proto_config_add_string 'routing_algo' +} + +proto_batadv_setup() { + local config="$1" + local iface="$config" + + local aggregated_ogms + local ap_isolation + local bonding + local bridge_loop_avoidance + local distributed_arp_table + local fragmentation + local gw_bandwidth + local gw_mode + local gw_sel_class + local hop_penalty + local isolation_mark + local log_level + local multicast_fanout + local multicast_mode + local network_coding + local orig_interval + local routing_algo + + json_get_vars aggregated_ogms + json_get_vars ap_isolation + json_get_vars bonding + json_get_vars bridge_loop_avoidance + json_get_vars distributed_arp_table + json_get_vars fragmentation + json_get_vars gw_bandwidth + json_get_vars gw_mode + json_get_vars gw_sel_class + json_get_vars hop_penalty + json_get_vars isolation_mark + json_get_vars log_level + json_get_vars multicast_fanout + json_get_vars multicast_mode + json_get_vars network_coding + json_get_vars orig_interval + json_get_vars routing_algo + + set_default routing_algo 'BATMAN_IV' + + batctl routing_algo "$routing_algo" + batctl meshif "$iface" interface create + + [ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms" + [ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation" + [ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding" + [ -n "$bridge_loop_avoidance" ] && batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&- + [ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&- + [ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation" + + case "$gw_mode" in + server) + if [ -n "$gw_bandwidth" ]; then + batctl meshif "$iface" gw_mode "server" "$gw_bandwidth" + else + batctl meshif "$iface" gw_mode "server" + fi + ;; + client) + if [ -n "$gw_sel_class" ]; then + batctl meshif "$iface" gw_mode "client" "$gw_sel_class" + else + batctl meshif "$iface" gw_mode "client" + fi + ;; + *) + batctl meshif "$iface" gw_mode "off" + ;; + esac + + [ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty" + [ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark" + [ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout" + [ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&- + [ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&- + [ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&- + [ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval" + + proto_init_update "$iface" 1 + proto_send_update "$config" +} + +proto_batadv_teardown() { + local config="$1" + local iface="$config" + + batctl meshif "$iface" interface destroy +} + +add_protocol batadv diff --git a/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_hardif.sh b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_hardif.sh new file mode 100755 index 000000000..b2f87dd6c --- /dev/null +++ b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_hardif.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + init_proto "$@" +} + +proto_batadv_hardif_init_config() { + proto_config_add_int 'elp_interval' + proto_config_add_int 'hop_penalty' + proto_config_add_string "master" + proto_config_add_string 'throughput_override' +} + +proto_batadv_hardif_setup() { + local config="$1" + local iface="$2" + + local elp_interval + local hop_penalty + local master + local throughput_override + + json_get_vars elp_interval + json_get_vars hop_penalty + json_get_vars master + json_get_vars throughput_override + + ( proto_add_host_dependency "$config" '' "$master" ) + + batctl meshif "$master" interface -M add "$iface" + + [ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval" + [ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty" + [ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override" + + proto_init_update "$iface" 1 + proto_send_update "$config" +} + +proto_batadv_hardif_teardown() { + local config="$1" + local iface="$2" + + local master + + json_get_vars master + + batctl meshif "$master" interface -M del "$iface" || true +} + +add_protocol batadv_hardif diff --git a/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_vlan.sh b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_vlan.sh new file mode 100755 index 000000000..115e61cde --- /dev/null +++ b/feeds/wifi-ax/batman-adv/files/lib/netifd/proto/batadv_vlan.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +. /lib/functions.sh +. ../netifd-proto.sh +init_proto "$@" + +proto_batadv_vlan_init_config() { + proto_config_add_boolean 'ap_isolation:bool' +} + +proto_batadv_vlan_setup() { + local config="$1" + local iface="$2" + + # batadv_vlan options + local ap_isolation + + json_get_vars ap_isolation + + [ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation" + proto_init_update "$iface" 1 + proto_send_update "$config" +} + +add_protocol batadv_vlan diff --git a/feeds/wifi-ax/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch b/feeds/wifi-ax/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch new file mode 100644 index 000000000..a3ca5d0c0 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch @@ -0,0 +1,128 @@ +From: Sven Eckelmann +Date: Sat, 24 Oct 2020 22:51:23 +0200 +Subject: Revert "batman-adv: genetlink: move to smaller ops wherever possible" + +The netlink genl_ops interface was splitted into two parts for Linux 5.10. +The batman-adv code changed to the new one because it doesn't use the more +complex policy handling of genl_ops. But the backports-5.8-1 version in +OpenWrt doesn't yet support the new genl_small_ops. + +This patch must be dropped directly when OpenWrt switches to backports-5.10 +or newer - otherwise it will not work as expected. + +This reverts commit 725b4ef5be840cfcd0ca33b9393c14dee40c10f7. + +--- a/compat-include/net/genetlink.h ++++ b/compat-include/net/genetlink.h +@@ -31,17 +31,15 @@ void batadv_genl_dump_check_consistent(s + #endif /* LINUX_VERSION_IS_LESS(4, 15, 0) */ + + +-#if LINUX_VERSION_IS_LESS(5, 10, 0) +- + #if LINUX_VERSION_IS_LESS(5, 2, 0) ++ + enum genl_validate_flags { + GENL_DONT_VALIDATE_STRICT = BIT(0), + GENL_DONT_VALIDATE_DUMP = BIT(1), + GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2), + }; +-#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */ + +-struct batadv_genl_small_ops { ++struct batadv_genl_ops { + int (*doit)(struct sk_buff *skb, + struct genl_info *info); + int (*dumpit)(struct sk_buff *skb, +@@ -70,9 +68,9 @@ struct batadv_genl_family { + struct genl_info *info); + void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb, + struct genl_info *info); +- const struct batadv_genl_small_ops *small_ops; ++ const struct batadv_genl_ops *ops; + const struct genl_multicast_group *mcgrps; +- unsigned int n_small_ops; ++ unsigned int n_ops; + unsigned int n_mcgrps; + struct module *module; + +@@ -96,32 +94,24 @@ static inline int batadv_genl_register_f + family->family.pre_doit = family->pre_doit; + family->family.post_doit = family->post_doit; + family->family.mcgrps = family->mcgrps; +- family->family.n_ops = family->n_small_ops; ++ family->family.n_ops = family->n_ops; + family->family.n_mcgrps = family->n_mcgrps; + family->family.module = family->module; + +- ops = kzalloc(sizeof(*ops) * family->n_small_ops, GFP_KERNEL); ++ ops = kzalloc(sizeof(*ops) * family->n_ops, GFP_KERNEL); + if (!ops) + return -ENOMEM; + + for (i = 0; i < family->family.n_ops; i++) { +- ops[i].doit = family->small_ops[i].doit; +- ops[i].dumpit = family->small_ops[i].dumpit; +- ops[i].done = family->small_ops[i].done; +- ops[i].cmd = family->small_ops[i].cmd; +- ops[i].internal_flags = family->small_ops[i].internal_flags; +- ops[i].flags = family->small_ops[i].flags; +-#if LINUX_VERSION_IS_GEQ(5, 2, 0) +- ops[i].validate = family->small_ops[i].validate; +-#else ++ ops[i].doit = family->ops[i].doit; ++ ops[i].dumpit = family->ops[i].dumpit; ++ ops[i].done = family->ops[i].done; ++ ops[i].cmd = family->ops[i].cmd; ++ ops[i].internal_flags = family->ops[i].internal_flags; ++ ops[i].flags = family->ops[i].flags; + ops[i].policy = family->policy; +-#endif + } + +-#if LINUX_VERSION_IS_GEQ(5, 2, 0) +- family->family.policy = family->policy; +-#endif +- + family->family.ops = ops; + family->copy_ops = ops; + +@@ -136,7 +126,7 @@ typedef struct genl_ops batadv_genl_ops_ + #define batadv_post_doit(__x, __y, __z) \ + batadv_post_doit(const batadv_genl_ops_old *ops, __y, __z) + +-#define genl_small_ops batadv_genl_small_ops ++#define genl_ops batadv_genl_ops + #define genl_family batadv_genl_family + + #define genl_register_family(family) \ +@@ -160,6 +150,6 @@ batadv_genl_unregister_family(struct bat + genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \ + _group, _flags) + +-#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */ ++#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */ + + #endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */ +--- a/net/batman-adv/netlink.c ++++ b/net/batman-adv/netlink.c +@@ -1351,7 +1351,7 @@ static void batadv_post_doit(const struc + } + } + +-static const struct genl_small_ops batadv_netlink_ops[] = { ++static const struct genl_ops batadv_netlink_ops[] = { + { + .cmd = BATADV_CMD_GET_MESH, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +@@ -1485,8 +1485,8 @@ struct genl_family batadv_netlink_family + .pre_doit = batadv_pre_doit, + .post_doit = batadv_post_doit, + .module = THIS_MODULE, +- .small_ops = batadv_netlink_ops, +- .n_small_ops = ARRAY_SIZE(batadv_netlink_ops), ++ .ops = batadv_netlink_ops, ++ .n_ops = ARRAY_SIZE(batadv_netlink_ops), + .mcgrps = batadv_netlink_mcgrps, + .n_mcgrps = ARRAY_SIZE(batadv_netlink_mcgrps), + }; diff --git a/feeds/wifi-ax/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch b/feeds/wifi-ax/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch new file mode 100644 index 000000000..afeadf54a --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch @@ -0,0 +1,116 @@ +From: Sven Eckelmann +Date: Thu, 28 Jan 2021 21:06:51 +0100 +Subject: Revert "batman-adv: Add new include for min/max helpers" + +The OpenWrt kernel sources and backports sources are currently missing this +header. + +This reverts commit 1810de05310d5c5e9140f870ac21052f38bc06b8. + +Signed-off-by: Sven Eckelmann + +--- a/compat-include/linux/minmax.h ++++ /dev/null +@@ -1,20 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-/* Copyright (C) B.A.T.M.A.N. contributors: +- * +- * Marek Lindner, Simon Wunderlich +- * +- * This file contains macros for maintaining compatibility with older versions +- * of the Linux kernel. +- */ +- +-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ +-#define _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ +- +-#include +-#if LINUX_VERSION_IS_GEQ(5, 10, 0) +-#include_next +-#else +-#include +-#endif +- +-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ */ +--- a/net/batman-adv/bat_v.c ++++ b/net/batman-adv/bat_v.c +@@ -15,7 +15,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/bat_v_elp.c ++++ b/net/batman-adv/bat_v_elp.c +@@ -18,7 +18,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/bat_v_ogm.c ++++ b/net/batman-adv/bat_v_ogm.c +@@ -18,7 +18,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/fragmentation.c ++++ b/net/batman-adv/fragmentation.c +@@ -14,8 +14,8 @@ + #include + #include + #include ++#include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/hard-interface.c ++++ b/net/batman-adv/hard-interface.c +@@ -18,7 +18,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/main.c ++++ b/net/batman-adv/main.c +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/netlink.c ++++ b/net/batman-adv/netlink.c +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + #include + #include + #include +--- a/net/batman-adv/tp_meter.c ++++ b/net/batman-adv/tp_meter.c +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + #include + #include + #include diff --git a/feeds/wifi-ax/batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch b/feeds/wifi-ax/batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch new file mode 100644 index 000000000..4a03e9676 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch @@ -0,0 +1,34 @@ +From: Sven Eckelmann +Date: Fri, 14 May 2021 19:34:35 +0200 +Subject: batman-adv: Fix build of multicast code against Linux < 5.13 + +Fixes: 007b4c4b031f ("batman-adv: convert ifmcaddr6 to RCU") +Signed-off-by: Sven Eckelmann + +--- a/net/batman-adv/multicast.c ++++ b/net/batman-adv/multicast.c +@@ -454,9 +454,14 @@ batadv_mcast_mla_softif_get_ipv6(struct + return 0; + } + ++#if LINUX_VERSION_IS_LESS(5, 13, 0) ++ read_lock_bh(&in6_dev->lock); ++ for (pmc6 = in6_dev->mc_list; pmc6; pmc6 = pmc6->next) { ++#else + for (pmc6 = rcu_dereference(in6_dev->mc_list); + pmc6; + pmc6 = rcu_dereference(pmc6->next)) { ++#endif + if (IPV6_ADDR_MC_SCOPE(&pmc6->mca_addr) < + IPV6_ADDR_SCOPE_LINKLOCAL) + continue; +@@ -485,6 +490,9 @@ batadv_mcast_mla_softif_get_ipv6(struct + hlist_add_head(&new->list, mcast_list); + ret++; + } ++#if LINUX_VERSION_IS_LESS(5, 13, 0) ++ read_unlock_bh(&in6_dev->lock); ++#endif + rcu_read_unlock(); + + return ret; diff --git a/feeds/wifi-ax/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch b/feeds/wifi-ax/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch new file mode 100644 index 000000000..fc6a91a0a --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0004-batman-adv-Always-send-iface-index-name-in-genlmsg.patch @@ -0,0 +1,111 @@ +From: Sven Eckelmann +Date: Mon, 10 May 2021 15:05:42 +0200 +Subject: batman-adv: Always send iface index+name in genlmsg + +The batman-adv netlink messages often contain the interface index and +interface name in the same message. This makes it easy for the receiver to +operate on the incoming data when it either needs to print something or +needs to operate on the interface index. + +But one of the attributes was missing for: + +* neighbor table dumps +* originator table dumps +* gateway list dumps +* query of hardif information +* query of vid information + +The userspace therefore had to implement special workarounds using +SIOCGIFNAME or SIOCGIFINDEX depending on what was actually provided. +Providing both information simplifies the userspace code massively without +adding a lot of extra overhead in the kernel portion. + +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/77c7d62618259f22f36427eaa62668e6e1c43090 + +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -1849,6 +1849,8 @@ batadv_iv_ogm_orig_dump_subentry(struct + orig_node->orig) || + nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + neigh_node->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ neigh_node->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + neigh_node->if_incoming->net_dev->ifindex) || + nla_put_u8(msg, BATADV_ATTR_TQ, tq_avg) || +@@ -2078,6 +2080,8 @@ batadv_iv_ogm_neigh_dump_neigh(struct sk + + if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + hardif_neigh->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ hardif_neigh->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + hardif_neigh->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, +@@ -2459,6 +2463,8 @@ static int batadv_iv_gw_dump_entry(struc + router->addr) || + nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, + router->if_incoming->net_dev->name) || ++ nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, ++ router->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN, + gw_node->bandwidth_down) || + nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_UP, +--- a/net/batman-adv/bat_v.c ++++ b/net/batman-adv/bat_v.c +@@ -145,6 +145,8 @@ batadv_v_neigh_dump_neigh(struct sk_buff + + if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + hardif_neigh->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ hardif_neigh->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + hardif_neigh->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, +@@ -297,6 +299,8 @@ batadv_v_orig_dump_subentry(struct sk_bu + if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN, orig_node->orig) || + nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN, + neigh_node->addr) || ++ nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, ++ neigh_node->if_incoming->net_dev->name) || + nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + neigh_node->if_incoming->net_dev->ifindex) || + nla_put_u32(msg, BATADV_ATTR_THROUGHPUT, throughput) || +@@ -737,6 +741,12 @@ static int batadv_v_gw_dump_entry(struct + genlmsg_cancel(msg, hdr); + goto out; + } ++ ++ if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, ++ router->if_incoming->net_dev->ifindex)) { ++ genlmsg_cancel(msg, hdr); ++ goto out; ++ } + + if (nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN, + gw_node->bandwidth_down)) { +--- a/net/batman-adv/netlink.c ++++ b/net/batman-adv/netlink.c +@@ -813,6 +813,10 @@ static int batadv_netlink_hardif_fill(st + bat_priv->soft_iface->ifindex)) + goto nla_put_failure; + ++ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME, ++ bat_priv->soft_iface->name)) ++ goto nla_put_failure; ++ + if (nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX, + net_dev->ifindex) || + nla_put_string(msg, BATADV_ATTR_HARD_IFNAME, +@@ -1044,6 +1048,10 @@ static int batadv_netlink_vlan_fill(stru + bat_priv->soft_iface->ifindex)) + goto nla_put_failure; + ++ if (nla_put_string(msg, BATADV_ATTR_MESH_IFNAME, ++ bat_priv->soft_iface->name)) ++ goto nla_put_failure; ++ + if (nla_put_u32(msg, BATADV_ATTR_VLANID, vlan->vid & VLAN_VID_MASK)) + goto nla_put_failure; + diff --git a/feeds/wifi-ax/batman-adv/patches/0005-batman-adv-Avoid-WARN_ON-timing-related-checks.patch b/feeds/wifi-ax/batman-adv/patches/0005-batman-adv-Avoid-WARN_ON-timing-related-checks.patch new file mode 100644 index 000000000..0fcb9ec3f --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0005-batman-adv-Avoid-WARN_ON-timing-related-checks.patch @@ -0,0 +1,31 @@ +From: Sven Eckelmann +Date: Tue, 18 May 2021 21:00:27 +0200 +Subject: batman-adv: Avoid WARN_ON timing related checks + +The soft/batadv interface for a queued OGM can be changed during the time +the OGM was queued for transmission and when the OGM is actually +transmitted by the worker. + +But WARN_ON must be used to denote kernel bugs and not to print simple +warnings. A warning can simply be printed using pr_warn. + +Reported-by: Tetsuo Handa +Reported-by: syzbot+c0b807de416427ff3dd1@syzkaller.appspotmail.com +Fixes: 29b9256e6631 ("batman-adv: consider outgoing interface in OGM sending") +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/5061f9c502d7101912089d8f4a7866e0a926a49a + +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -409,8 +409,10 @@ static void batadv_iv_ogm_emit(struct ba + if (WARN_ON(!forw_packet->if_outgoing)) + return; + +- if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface)) ++ if (forw_packet->if_outgoing->soft_iface != soft_iface) { ++ pr_warn("%s: soft interface switch for queued OGM\n", __func__); + return; ++ } + + if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE) + return; diff --git a/feeds/wifi-ax/batman-adv/patches/0006-batman-adv-fix-error-handling.patch b/feeds/wifi-ax/batman-adv/patches/0006-batman-adv-fix-error-handling.patch new file mode 100644 index 000000000..f0a00d70c --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0006-batman-adv-fix-error-handling.patch @@ -0,0 +1,162 @@ +From: Pavel Skripkin +Date: Sun, 24 Oct 2021 16:13:56 +0300 +Subject: batman-adv: fix error handling + +Syzbot reported ODEBUG warning in batadv_nc_mesh_free(). The problem was +in wrong error handling in batadv_mesh_init(). + +Before this patch batadv_mesh_init() was calling batadv_mesh_free() in case +of any batadv_*_init() calls failure. This approach may work well, when +there is some kind of indicator, which can tell which parts of batadv are +initialized; but there isn't any. + +All written above lead to cleaning up uninitialized fields. Even if we hide +ODEBUG warning by initializing bat_priv->nc.work, syzbot was able to hit +GPF in batadv_nc_purge_paths(), because hash pointer in still NULL. [1] + +To fix these bugs we can unwind batadv_*_init() calls one by one. +It is good approach for 2 reasons: 1) It fixes bugs on error handling +path 2) It improves the performance, since we won't call unneeded +batadv_*_free() functions. + +So, this patch makes all batadv_*_init() clean up all allocated memory +before returning with an error to no call correspoing batadv_*_free() +and open-codes batadv_mesh_free() with proper order to avoid touching +uninitialized fields. + +Link: https://lore.kernel.org/netdev/000000000000c87fbd05cef6bcb0@google.com/ [1] +Reported-and-tested-by: syzbot+28b0702ada0bf7381f58@syzkaller.appspotmail.com +Fixes: 21e838760727 ("[batman-adv] fix various race conditions during startup & shutdown") +Signed-off-by: Pavel Skripkin +Signed-off-by: David S. Miller +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0631e0825c8129cd3896926da62a09ac00bf13a0 + +--- a/net/batman-adv/bridge_loop_avoidance.c ++++ b/net/batman-adv/bridge_loop_avoidance.c +@@ -1556,10 +1556,14 @@ int batadv_bla_init(struct batadv_priv * + return 0; + + bat_priv->bla.claim_hash = batadv_hash_new(128); +- bat_priv->bla.backbone_hash = batadv_hash_new(32); ++ if (!bat_priv->bla.claim_hash) ++ return -ENOMEM; + +- if (!bat_priv->bla.claim_hash || !bat_priv->bla.backbone_hash) ++ bat_priv->bla.backbone_hash = batadv_hash_new(32); ++ if (!bat_priv->bla.backbone_hash) { ++ batadv_hash_destroy(bat_priv->bla.claim_hash); + return -ENOMEM; ++ } + + batadv_hash_set_lock_class(bat_priv->bla.claim_hash, + &batadv_claim_hash_lock_class_key); +--- a/net/batman-adv/main.c ++++ b/net/batman-adv/main.c +@@ -189,29 +189,41 @@ int batadv_mesh_init(struct net_device * + + bat_priv->gw.generation = 0; + +- ret = batadv_v_mesh_init(bat_priv); +- if (ret < 0) +- goto err; +- + ret = batadv_originator_init(bat_priv); +- if (ret < 0) +- goto err; ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_orig; ++ } + + ret = batadv_tt_init(bat_priv); +- if (ret < 0) +- goto err; ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_tt; ++ } ++ ++ ret = batadv_v_mesh_init(bat_priv); ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_v; ++ } + + ret = batadv_bla_init(bat_priv); +- if (ret < 0) +- goto err; ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_bla; ++ } + + ret = batadv_dat_init(bat_priv); +- if (ret < 0) +- goto err; ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_dat; ++ } + + ret = batadv_nc_mesh_init(bat_priv); +- if (ret < 0) +- goto err; ++ if (ret < 0) { ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING); ++ goto err_nc; ++ } + + batadv_gw_init(bat_priv); + batadv_mcast_init(bat_priv); +@@ -221,8 +233,20 @@ int batadv_mesh_init(struct net_device * + + return 0; + +-err: +- batadv_mesh_free(soft_iface); ++err_nc: ++ batadv_dat_free(bat_priv); ++err_dat: ++ batadv_bla_free(bat_priv); ++err_bla: ++ batadv_v_mesh_free(bat_priv); ++err_v: ++ batadv_tt_free(bat_priv); ++err_tt: ++ batadv_originator_free(bat_priv); ++err_orig: ++ batadv_purge_outstanding_packets(bat_priv, NULL); ++ atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE); ++ + return ret; + } + +--- a/net/batman-adv/network-coding.c ++++ b/net/batman-adv/network-coding.c +@@ -152,8 +152,10 @@ int batadv_nc_mesh_init(struct batadv_pr + &batadv_nc_coding_hash_lock_class_key); + + bat_priv->nc.decoding_hash = batadv_hash_new(128); +- if (!bat_priv->nc.decoding_hash) ++ if (!bat_priv->nc.decoding_hash) { ++ batadv_hash_destroy(bat_priv->nc.coding_hash); + goto err; ++ } + + batadv_hash_set_lock_class(bat_priv->nc.decoding_hash, + &batadv_nc_decoding_hash_lock_class_key); +--- a/net/batman-adv/translation-table.c ++++ b/net/batman-adv/translation-table.c +@@ -4193,8 +4193,10 @@ int batadv_tt_init(struct batadv_priv *b + return ret; + + ret = batadv_tt_global_init(bat_priv); +- if (ret < 0) ++ if (ret < 0) { ++ batadv_tt_local_table_free(bat_priv); + return ret; ++ } + + batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1, + batadv_tt_tvlv_unicast_handler_v1, diff --git a/feeds/wifi-ax/batman-adv/patches/0007-batman-adv-allow-netlink-usage-in-unprivileged-conta.patch b/feeds/wifi-ax/batman-adv/patches/0007-batman-adv-allow-netlink-usage-in-unprivileged-conta.patch new file mode 100644 index 000000000..83ebf5e48 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0007-batman-adv-allow-netlink-usage-in-unprivileged-conta.patch @@ -0,0 +1,182 @@ +From: Linus Lüssing +Date: Mon, 1 Nov 2021 21:46:17 +0100 +Subject: batman-adv: allow netlink usage in unprivileged containers + +Currently, creating a batman-adv interface in an unprivileged LXD +container and attaching secondary interfaces to it with "ip" or "batctl" +works fine. However all batctl debug and configuration commands +fail: + + root@container:~# batctl originators + Error received: Operation not permitted + root@container:~# batctl orig_interval + 1000 + root@container:~# batctl orig_interval 2000 + root@container:~# batctl orig_interval + 1000 + +To fix this change the generic netlink permissions from GENL_ADMIN_PERM +to GENL_UNS_ADMIN_PERM. This way a batman-adv interface is fully +maintainable as root from within a user namespace, from an unprivileged +container. + +All except one batman-adv netlink setting are per interface and do not +leak information or change settings from the host system and are +therefore save to retrieve or modify as root from within an unprivileged +container. + +"batctl routing_algo" / BATADV_CMD_GET_ROUTING_ALGOS is the only +exception: It provides the batman-adv kernel module wide default routing +algorithm. However it is read-only from netlink and an unprivileged +container is still not allowed to modify +/sys/module/batman_adv/parameters/routing_algo. Instead it is advised to +use the newly introduced "batctl if create routing_algo RA_NAME" / +IFLA_BATADV_ALGO_NAME to set the routing algorithm on interface +creation, which already works fine in an unprivileged container. + +Cc: Tycho Andersen +Signed-off-by: Linus Lüssing +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/055fa41b73ca8dae1c1ed41777e32a8f02e80c82 + +--- /dev/null ++++ b/compat-include/uapi/linux/genetlink.h +@@ -0,0 +1,22 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* Copyright (C) B.A.T.M.A.N. contributors: ++ * ++ * Marek Lindner, Simon Wunderlich ++ * ++ * This file contains macros for maintaining compatibility with older versions ++ * of the Linux kernel. ++ */ ++ ++#ifndef _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_GENETLINK_H_ ++#define _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_GENETLINK_H_ ++ ++#include ++#include_next ++ ++#if LINUX_VERSION_IS_LESS(4, 6, 0) ++ ++#define GENL_UNS_ADMIN_PERM GENL_ADMIN_PERM ++ ++#endif /* LINUX_VERSION_IS_LESS(4, 6, 0) */ ++ ++#endif /* _NET_BATMAN_ADV_COMPAT_UAPI_LINUX_GENETLINK_H_ */ +--- a/net/batman-adv/netlink.c ++++ b/net/batman-adv/netlink.c +@@ -1369,21 +1369,21 @@ static const struct genl_ops batadv_netl + { + .cmd = BATADV_CMD_TP_METER, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .doit = batadv_netlink_tp_meter_start, + .internal_flags = BATADV_FLAG_NEED_MESH, + }, + { + .cmd = BATADV_CMD_TP_METER_CANCEL, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .doit = batadv_netlink_tp_meter_cancel, + .internal_flags = BATADV_FLAG_NEED_MESH, + }, + { + .cmd = BATADV_CMD_GET_ROUTING_ALGOS, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_algo_dump, + }, + { +@@ -1398,68 +1398,68 @@ static const struct genl_ops batadv_netl + { + .cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_tt_local_dump, + }, + { + .cmd = BATADV_CMD_GET_TRANSTABLE_GLOBAL, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_tt_global_dump, + }, + { + .cmd = BATADV_CMD_GET_ORIGINATORS, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_orig_dump, + }, + { + .cmd = BATADV_CMD_GET_NEIGHBORS, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_hardif_neigh_dump, + }, + { + .cmd = BATADV_CMD_GET_GATEWAYS, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_gw_dump, + }, + { + .cmd = BATADV_CMD_GET_BLA_CLAIM, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_bla_claim_dump, + }, + { + .cmd = BATADV_CMD_GET_BLA_BACKBONE, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_bla_backbone_dump, + }, + { + .cmd = BATADV_CMD_GET_DAT_CACHE, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_dat_cache_dump, + }, + { + .cmd = BATADV_CMD_GET_MCAST_FLAGS, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .dumpit = batadv_mcast_flags_dump, + }, + { + .cmd = BATADV_CMD_SET_MESH, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .doit = batadv_netlink_set_mesh, + .internal_flags = BATADV_FLAG_NEED_MESH, + }, + { + .cmd = BATADV_CMD_SET_HARDIF, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .doit = batadv_netlink_set_hardif, + .internal_flags = BATADV_FLAG_NEED_MESH | + BATADV_FLAG_NEED_HARDIF, +@@ -1475,7 +1475,7 @@ static const struct genl_ops batadv_netl + { + .cmd = BATADV_CMD_SET_VLAN, + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, +- .flags = GENL_ADMIN_PERM, ++ .flags = GENL_UNS_ADMIN_PERM, + .doit = batadv_netlink_set_vlan, + .internal_flags = BATADV_FLAG_NEED_MESH | + BATADV_FLAG_NEED_VLAN, diff --git a/feeds/wifi-ax/batman-adv/patches/0008-batman-adv-mcast-don-t-send-link-local-multicast-to-.patch b/feeds/wifi-ax/batman-adv/patches/0008-batman-adv-mcast-don-t-send-link-local-multicast-to-.patch new file mode 100644 index 000000000..ef01214a5 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/0008-batman-adv-mcast-don-t-send-link-local-multicast-to-.patch @@ -0,0 +1,165 @@ +From: Linus Lüssing +Date: Sat, 1 Jan 2022 06:27:13 +0100 +Subject: batman-adv: mcast: don't send link-local multicast to mcast routers + +The addition of routable multicast TX handling introduced a +bug/regression for packets with a link-local multicast destination: +These packets would be sent to all batman-adv nodes with a multicast +router and to all batman-adv nodes with an old version without multicast +router detection. + +This even disregards the batman-adv multicast fanout setting, which can +potentially lead to an unwanted, high number of unicast transmissions or +even congestion. + +Fixing this by avoiding to send link-local multicast packets to nodes in +the multicast router list. + +Fixes: 3a8df00cd969 ("batman-adv: mcast: apply optimizations for routable packets, too") +Signed-off-by: Linus Lüssing +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ee013870947b9175847aa46a0686ca01dd480af4 + +--- a/net/batman-adv/multicast.c ++++ b/net/batman-adv/multicast.c +@@ -1380,6 +1380,7 @@ batadv_mcast_forw_rtr_node_get(struct ba + * @bat_priv: the bat priv with all the soft interface information + * @skb: The multicast packet to check + * @orig: an originator to be set to forward the skb to ++ * @is_routable: stores whether the destination is routable + * + * Return: the forwarding mode as enum batadv_forw_mode and in case of + * BATADV_FORW_SINGLE set the orig to the single originator the skb +@@ -1387,17 +1388,16 @@ batadv_mcast_forw_rtr_node_get(struct ba + */ + enum batadv_forw_mode + batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb, +- struct batadv_orig_node **orig) ++ struct batadv_orig_node **orig, int *is_routable) + { + int ret, tt_count, ip_count, unsnoop_count, total_count; + bool is_unsnoopable = false; + unsigned int mcast_fanout; + struct ethhdr *ethhdr; +- int is_routable = 0; + int rtr_count = 0; + + ret = batadv_mcast_forw_mode_check(bat_priv, skb, &is_unsnoopable, +- &is_routable); ++ is_routable); + if (ret == -ENOMEM) + return BATADV_FORW_NONE; + else if (ret < 0) +@@ -1410,7 +1410,7 @@ batadv_mcast_forw_mode(struct batadv_pri + ip_count = batadv_mcast_forw_want_all_ip_count(bat_priv, ethhdr); + unsnoop_count = !is_unsnoopable ? 0 : + atomic_read(&bat_priv->mcast.num_want_all_unsnoopables); +- rtr_count = batadv_mcast_forw_rtr_count(bat_priv, is_routable); ++ rtr_count = batadv_mcast_forw_rtr_count(bat_priv, *is_routable); + + total_count = tt_count + ip_count + unsnoop_count + rtr_count; + +@@ -1730,6 +1730,7 @@ batadv_mcast_forw_want_rtr(struct batadv + * @bat_priv: the bat priv with all the soft interface information + * @skb: the multicast packet to transmit + * @vid: the vlan identifier ++ * @is_routable: stores whether the destination is routable + * + * Sends copies of a frame with multicast destination to any node that signaled + * interest in it, that is either via the translation table or the according +@@ -1742,7 +1743,7 @@ batadv_mcast_forw_want_rtr(struct batadv + * is neither IPv4 nor IPv6. NET_XMIT_SUCCESS otherwise. + */ + int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb, +- unsigned short vid) ++ unsigned short vid, int is_routable) + { + int ret; + +@@ -1758,12 +1759,16 @@ int batadv_mcast_forw_send(struct batadv + return ret; + } + ++ if (!is_routable) ++ goto skip_mc_router; ++ + ret = batadv_mcast_forw_want_rtr(bat_priv, skb, vid); + if (ret != NET_XMIT_SUCCESS) { + kfree_skb(skb); + return ret; + } + ++skip_mc_router: + consume_skb(skb); + return ret; + } +--- a/net/batman-adv/multicast.h ++++ b/net/batman-adv/multicast.h +@@ -43,7 +43,8 @@ enum batadv_forw_mode { + + enum batadv_forw_mode + batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb, +- struct batadv_orig_node **mcast_single_orig); ++ struct batadv_orig_node **mcast_single_orig, ++ int *is_routable); + + int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv, + struct sk_buff *skb, +@@ -51,7 +52,7 @@ int batadv_mcast_forw_send_orig(struct b + struct batadv_orig_node *orig_node); + + int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb, +- unsigned short vid); ++ unsigned short vid, int is_routable); + + void batadv_mcast_init(struct batadv_priv *bat_priv); + +@@ -68,7 +69,8 @@ void batadv_mcast_purge_orig(struct bata + + static inline enum batadv_forw_mode + batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb, +- struct batadv_orig_node **mcast_single_orig) ++ struct batadv_orig_node **mcast_single_orig, ++ int *is_routable) + { + return BATADV_FORW_ALL; + } +@@ -85,7 +87,7 @@ batadv_mcast_forw_send_orig(struct batad + + static inline int + batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb, +- unsigned short vid) ++ unsigned short vid, int is_routable) + { + kfree_skb(skb); + return NET_XMIT_DROP; +--- a/net/batman-adv/soft-interface.c ++++ b/net/batman-adv/soft-interface.c +@@ -198,6 +198,7 @@ static netdev_tx_t batadv_interface_tx(s + int gw_mode; + enum batadv_forw_mode forw_mode = BATADV_FORW_SINGLE; + struct batadv_orig_node *mcast_single_orig = NULL; ++ int mcast_is_routable = 0; + int network_offset = ETH_HLEN; + __be16 proto; + +@@ -300,7 +301,8 @@ static netdev_tx_t batadv_interface_tx(s + send: + if (do_bcast && !is_broadcast_ether_addr(ethhdr->h_dest)) { + forw_mode = batadv_mcast_forw_mode(bat_priv, skb, +- &mcast_single_orig); ++ &mcast_single_orig, ++ &mcast_is_routable); + if (forw_mode == BATADV_FORW_NONE) + goto dropped; + +@@ -365,7 +367,8 @@ send: + ret = batadv_mcast_forw_send_orig(bat_priv, skb, vid, + mcast_single_orig); + } else if (forw_mode == BATADV_FORW_SOME) { +- ret = batadv_mcast_forw_send(bat_priv, skb, vid); ++ ret = batadv_mcast_forw_send(bat_priv, skb, vid, ++ mcast_is_routable); + } else { + if (batadv_dat_snoop_outgoing_arp_request(bat_priv, + skb)) diff --git a/feeds/wifi-ax/batman-adv/patches/9005-Revert-batman-adv-Migrate-to-linux-prandom.h.patch b/feeds/wifi-ax/batman-adv/patches/9005-Revert-batman-adv-Migrate-to-linux-prandom.h.patch new file mode 100644 index 000000000..3f10f85a5 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/patches/9005-Revert-batman-adv-Migrate-to-linux-prandom.h.patch @@ -0,0 +1,56 @@ +From: Sven Eckelmann +Date: Tue, 18 May 2021 19:47:14 +0200 +Subject: Revert "batman-adv: Migrate to linux/prandom.h" + +This reverts commit fe773e9e389a763f38539de3d4782b628676ac99. + +diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c +index 680def809838097a9949de1dc9861923911f3d04..97000fe0ae2cebd9dc2fdf02c30faa1caa36a6c8 100644 +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -27,7 +27,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c +index 4d8e3fdb4427a431cab903bc8a20edb816079fd7..3b3c890870ee6941c337ce820f661f216a819161 100644 +--- a/net/batman-adv/bat_v_elp.c ++++ b/net/batman-adv/bat_v_elp.c +@@ -20,7 +20,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c +index 89ba88322c9c11acc49a9dcd9877ad8767fe713b..cb0bce3774898884b399dd0eb5ba4e03364a2fdd 100644 +--- a/net/batman-adv/bat_v_ogm.c ++++ b/net/batman-adv/bat_v_ogm.c +@@ -20,7 +20,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c +index 4bb76b434d0711dd67b8521e05c64772b4c48434..aceb1b2bb04db385f40deb94dd78901312150a17 100644 +--- a/net/batman-adv/network-coding.c ++++ b/net/batman-adv/network-coding.c +@@ -25,8 +25,8 @@ + #include + #include + #include +-#include + #include ++#include + #include + #include + #include diff --git a/feeds/wifi-ax/batman-adv/src/compat-hacks.h b/feeds/wifi-ax/batman-adv/src/compat-hacks.h new file mode 100644 index 000000000..32730a344 --- /dev/null +++ b/feeds/wifi-ax/batman-adv/src/compat-hacks.h @@ -0,0 +1,125 @@ +/* Please avoid adding hacks here - instead add it to mac80211/backports.git */ + +#undef CONFIG_MODULE_STRIPPED + +#include /* LINUX_VERSION_CODE */ +#include + +#if LINUX_VERSION_IS_LESS(5, 10, 0) + +#include + +struct batadv_br_ip { + union { + __be32 ip4; +#if IS_ENABLED(CONFIG_IPV6) + struct in6_addr ip6; +#endif + } dst; + __be16 proto; + __u16 vid; +}; + +struct batadv_br_ip_list { + struct list_head list; + struct batadv_br_ip addr; +}; + +#if 0 +/* "static" dropped to force compiler to evaluate it as part of multicast.c + * might need to be added again and then called in some kind of dummy + * compat.c in case this header is included in multiple files. + */ +inline void __batadv_br_ip_list_check(void) +{ + BUILD_BUG_ON(sizeof(struct batadv_br_ip_list) != sizeof(struct br_ip_list)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, list) != offsetof(struct br_ip_list, list)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, addr) != offsetof(struct br_ip_list, addr)); + + BUILD_BUG_ON(sizeof(struct batadv_br_ip) != sizeof(struct br_ip)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip4) != offsetof(struct br_ip, u.ip4)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip6) != offsetof(struct br_ip, u.ip6)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip, proto) != offsetof(struct br_ip, proto)); + BUILD_BUG_ON(offsetof(struct batadv_br_ip, vid) != offsetof(struct br_ip, vid)); +} +#endif + +#define br_ip batadv_br_ip +#define br_ip_list batadv_br_ip_list + +#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */ + +/* */ + +#include +#include_next + +#include + +#ifdef DECLARE_EWMA +#undef DECLARE_EWMA +#endif /* DECLARE_EWMA */ + +/* + * Exponentially weighted moving average (EWMA) + * + * This implements a fixed-precision EWMA algorithm, with both the + * precision and fall-off coefficient determined at compile-time + * and built into the generated helper funtions. + * + * The first argument to the macro is the name that will be used + * for the struct and helper functions. + * + * The second argument, the precision, expresses how many bits are + * used for the fractional part of the fixed-precision values. + * + * The third argument, the weight reciprocal, determines how the + * new values will be weighed vs. the old state, new values will + * get weight 1/weight_rcp and old values 1-1/weight_rcp. Note + * that this parameter must be a power of two for efficiency. + */ + +#define DECLARE_EWMA(name, _precision, _weight_rcp) \ + struct ewma_##name { \ + unsigned long internal; \ + }; \ + static inline void ewma_##name##_init(struct ewma_##name *e) \ + { \ + BUILD_BUG_ON(!__builtin_constant_p(_precision)); \ + BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \ + /* \ + * Even if you want to feed it just 0/1 you should have \ + * some bits for the non-fractional part... \ + */ \ + BUILD_BUG_ON((_precision) > 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + e->internal = 0; \ + } \ + static inline unsigned long \ + ewma_##name##_read(struct ewma_##name *e) \ + { \ + BUILD_BUG_ON(!__builtin_constant_p(_precision)); \ + BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \ + BUILD_BUG_ON((_precision) > 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + return e->internal >> (_precision); \ + } \ + static inline void ewma_##name##_add(struct ewma_##name *e, \ + unsigned long val) \ + { \ + unsigned long internal = READ_ONCE(e->internal); \ + unsigned long weight_rcp = ilog2(_weight_rcp); \ + unsigned long precision = _precision; \ + \ + BUILD_BUG_ON(!__builtin_constant_p(_precision)); \ + BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \ + BUILD_BUG_ON((_precision) > 30); \ + BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \ + \ + WRITE_ONCE(e->internal, internal ? \ + (((internal << weight_rcp) - internal) + \ + (val << precision)) >> weight_rcp : \ + (val << precision)); \ + } + +/* */ diff --git a/feeds/wifi-ax/batman-adv/src/compat-qca.h b/feeds/wifi-ax/batman-adv/src/compat-qca.h new file mode 100644 index 000000000..9e2709eac --- /dev/null +++ b/feeds/wifi-ax/batman-adv/src/compat-qca.h @@ -0,0 +1,216 @@ +#include /* LINUX_VERSION_CODE */ +#include + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0) + +#define dev_get_iflink(_net_dev) ((_net_dev)->iflink) + +#endif /* < KERNEL_VERSION(4, 1, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0) + +#include + +#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\ + BUILD_BUG_ON(upper_priv != NULL); \ + BUILD_BUG_ON(upper_info != NULL); \ + BUILD_BUG_ON(extack != NULL); \ + netdev_master_upper_dev_link(dev, upper_dev); \ +}) + +#elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) + +#include + +#define netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info, extack) ({\ + BUILD_BUG_ON(extack != NULL); \ + netdev_master_upper_dev_link(dev, upper_dev, upper_priv, upper_info); \ +}) + +#endif /* < KERNEL_VERSION(4, 5, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) + +/* wild hack for batadv_getlink_net only */ +#define get_link_net get_xstats_size || 1 ? fallback_net : (struct net*)netdev->rtnl_link_ops->get_xstats_size + +#endif /* < KERNEL_VERSION(4, 0, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) + +struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb, + unsigned int transport_len, + __sum16(*skb_chkf)(struct sk_buff *skb)); + +int ip_mc_check_igmp(struct sk_buff *skb); +int ipv6_mc_check_mld(struct sk_buff *skb); + +#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0) + +#include_next +#include_next + +static inline int batadv_ip_mc_check_igmp1(struct sk_buff *skb) +{ + return ip_mc_check_igmp(skb, NULL); +} + +static inline int batadv_ip_mc_check_igmp2(struct sk_buff *skb, + struct sk_buff **skb_trimmed) +{ + return ip_mc_check_igmp(skb, skb_trimmed); +} + +#define ip_mc_check_igmp_get(_1, _2, ip_mc_check_igmp_name, ...) ip_mc_check_igmp_name +#define ip_mc_check_igmp(...) \ + ip_mc_check_igmp_get(__VA_ARGS__, batadv_ip_mc_check_igmp2, batadv_ip_mc_check_igmp1)(__VA_ARGS__) + +#endif /* < KERNEL_VERSION(4, 2, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) + +#define IFF_NO_QUEUE 0; dev->tx_queue_len = 0 + +static inline bool hlist_fake(struct hlist_node *h) +{ + return h->pprev == &h->next; +} + +#endif /* < KERNEL_VERSION(4, 3, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) + +#include + +#define ethtool_link_ksettings batadv_ethtool_link_ksettings + +struct batadv_ethtool_link_ksettings { + struct { + __u32 speed; + __u8 duplex; + __u8 autoneg; + } base; +}; + +#define __ethtool_get_link_ksettings(__dev, __link_settings) \ + batadv_ethtool_get_link_ksettings(__dev, __link_settings) + +static inline int +batadv_ethtool_get_link_ksettings(struct net_device *dev, + struct ethtool_link_ksettings *link_ksettings) +{ + struct ethtool_cmd cmd; + int ret; + + memset(&cmd, 0, sizeof(cmd)); + ret = __ethtool_get_settings(dev, &cmd); + + if (ret != 0) + return ret; + + link_ksettings->base.duplex = cmd.duplex; + link_ksettings->base.speed = ethtool_cmd_speed(&cmd); + link_ksettings->base.autoneg = cmd.autoneg; + + return 0; +} + +#endif /* < KERNEL_VERSION(4, 6, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) + +#include_next + +/* hack for netlink.c which marked the family ops as ro */ +#ifdef __ro_after_init +#undef __ro_after_init +#endif +#define __ro_after_init + +#endif /* < KERNEL_VERSION(4, 10, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 9) + +#include + +/* work around missing attribute needs_free_netdev and priv_destructor in + * net_device + */ +#define ether_setup(dev) \ + void batadv_softif_free2(struct net_device *dev) \ + { \ + batadv_softif_free(dev); \ + free_netdev(dev); \ + } \ + void (*t1)(struct net_device *dev) __attribute__((unused)); \ + bool t2 __attribute__((unused)); \ + ether_setup(dev) +#define needs_free_netdev destructor = batadv_softif_free2; t2 +#define priv_destructor destructor = batadv_softif_free2; t1 + +#endif /* < KERNEL_VERSION(4, 11, 9) */ + + +#if LINUX_VERSION_IS_LESS(4, 13, 0) + +#define batadv_softif_validate(__tb, __data, __extack) \ + batadv_softif_validate(__tb, __data) + +#define batadv_softif_newlink(__src_net, __dev, __tb, __data, __extack) \ + batadv_softif_newlink(__src_net, __dev, __tb, __data) + +#endif /* LINUX_VERSION_IS_LESS(4, 13, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) + +#define batadv_softif_slave_add(__dev, __slave_dev, __extack) \ + batadv_softif_slave_add(__dev, __slave_dev) + +#endif /* < KERNEL_VERSION(4, 15, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 16, 0) + +#ifndef sizeof_field +#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) +#endif + +#endif /* < KERNEL_VERSION(4, 16, 0) */ + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) + +static inline int batadv_access_ok(int type, const void __user *p, + unsigned long size) +{ + return access_ok(type, p, size); +} + +#ifdef access_ok +#undef access_ok +#endif + +#define access_ok_get(_1, _2, _3 , access_ok_name, ...) access_ok_name +#define access_ok(...) \ + access_ok_get(__VA_ARGS__, access_ok3, access_ok2)(__VA_ARGS__) + +#define access_ok2(addr, size) batadv_access_ok(VERIFY_WRITE, (addr), (size)) +#define access_ok3(type, addr, size) batadv_access_ok((type), (addr), (size)) + +#endif /* < KERNEL_VERSION(5, 0, 0) */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) + +#ifndef fallthrough +#if __GNUC__ > 7 && !defined(__CHECKER__) +# define fallthrough __attribute__((__fallthrough__)) +#else +# define fallthrough do {} while (0) /* fallthrough */ +#endif +#endif + +#endif /* < KERNEL_VERSION(5, 4, 0) */ diff --git a/feeds/wifi-ax/mac80211/patches/pending/999-compat.patch b/feeds/wifi-ax/mac80211/patches/pending/999-compat.patch deleted file mode 100644 index abb00f728..000000000 --- a/feeds/wifi-ax/mac80211/patches/pending/999-compat.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/nss.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/nss.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/nss.c -@@ -15,6 +15,8 @@ - #include "wmi.h" - #include "../../../../../net/mac80211/sta_info.h" - -+#include -+ - enum nss_wifi_mesh_mpp_learning_mode mpp_mode = NSS_WIFI_MESH_MPP_LEARNING_MODE_INDEPENDENT_NSS; - LIST_HEAD(mesh_vaps); - diff --git a/feeds/wifi-ax/mac80211/patches/qca/321-001-qgic-api-compile-fix.patch b/feeds/wifi-ax/mac80211/patches/qca/321-001-qgic-api-compile-fix.patch deleted file mode 100644 index b83769642..000000000 --- a/feeds/wifi-ax/mac80211/patches/qca/321-001-qgic-api-compile-fix.patch +++ /dev/null @@ -1,382 +0,0 @@ -From aa2f204ed12b5543aa5f1dfb2b1bb6b458a9dba5 Mon Sep 17 00:00:00 2001 -From: Tamizh Chelvam -Date: Thu, 27 May 2021 17:24:24 +0530 -Subject: [PATCH 2/2] ath1k: Fix kernel API related compilation error - -Signed-off-by: Tamizh Chelvam ---- - drivers/net/wireless/ath/ath11k/ahb.c | 53 +++++++----------------------- - drivers/net/wireless/ath/ath11k/ce.c | 7 ++++ - drivers/net/wireless/ath/ath11k/core.h | 5 ++- - drivers/net/wireless/ath/ath11k/coredump.c | 4 +++ - drivers/net/wireless/ath/ath11k/debugfs.c | 1 + - drivers/net/wireless/ath/ath11k/pci.c | 50 ++++------------------------ - drivers/net/wireless/ath/ath11k/pci.h | 2 -- - drivers/net/wireless/ath/ath11k/pktlog.c | 8 +++++ - drivers/net/wireless/ath/ath11k/qmi.c | 14 ++++---- - 9 files changed, 46 insertions(+), 98 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -14,7 +14,6 @@ - #include "qmi.h" - #include "pci.h" - #include --#include - - static const struct of_device_id ath11k_ahb_of_match[] = { - /* TODO: Should we change the compatible string to something similar -@@ -610,55 +609,21 @@ static int ath11k_ahb_ext_irq_config(str - static void ath11k_internal_pci_free_irq(struct ath11k_base *ab) - { - ath11k_pci_free_irq(ab); -- qgic2_disable_msi(ab->ipci.qgicm_id); --} -- --struct qgic2_msi *ath11k_qgic2_enable_msi(struct ath11k_base *ab, int qgicm_id) --{ -- struct qgic2_msi *qgic2_msi; -- -- ab->ipci.msi_cfg = &ath11k_msi_config[ATH11K_MSI_CONFIG_QCN6122]; -- qgic2_msi = qgic2_enable_msi(qgicm_id, -- ab->ipci.msi_cfg->total_vectors); -- if (IS_ERR(qgic2_msi)) { -- ath11k_err(ab, "qgic2_enable_msi fails %ld\n", PTR_ERR(qgic2_msi)); -- return NULL; -- } -- -- return qgic2_msi; - } - - static int ath11k_config_irq_internal_pci(struct ath11k_base *ab) - { - int ret; - -- if (ab->userpd_id == QCN6122_USERPD_0) { -- ab->ipci.qgicm_id = APCS_QGIC2M_0; -- } else if (ab->userpd_id == QCN6122_USERPD_1) { -- ab->ipci.qgicm_id = APCS_QGIC2M_1; -- } else { -+ if (ab->userpd_id != QCN6122_USERPD_0 && -+ ab->userpd_id != QCN6122_USERPD_1) { - ath11k_warn(ab, "ath11k userpd invalid %d\n", ab->userpd_id); - return -ENODEV; - } - -- ab->ipci.qgic2_msi = -- ath11k_qgic2_enable_msi(ab, ab->ipci.qgicm_id); -- if (!ab->ipci.qgic2_msi) { -- ath11k_err(ab, "qgic2_msi fails: dev %d\n", ab->hw_rev); -- return -ENODEV; -- } -- ab->ipci.qgic_enabled = 1; -- wake_up(&ab->ipci.qgic_msi_waitq); -+ ab->ipci.gic_enabled = 1; -+ wake_up(&ab->ipci.gic_msi_waitq); - -- /* qcn6122 is seen as ahb based device by driver but internallly it is pci -- * Hence configuring pci irq for qcn6122 -- */ -- ret = ath11k_pci_config_qgic_msi_irq(ab); -- if (ret) { -- ath11k_err(ab, "internal pci msi configuration failed: dev %d\n", -- ab->hw_rev); -- qgic2_disable_msi(ab->ipci.qgicm_id); -- } - return ret; - } - -@@ -772,18 +737,20 @@ static const struct ath11k_hif_ops ath11 - .config_static_window = ath11k_pci_config_static_window, - .free_irq = ath11k_internal_pci_free_irq, - .config_irq = ath11k_config_irq_internal_pci, -- .get_msi_irq = ath11k_pci_get_qgic_msi_irq, - }; - - static int ath11k_core_get_rproc(struct ath11k_base *ab) - { - struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab); - struct device *dev = ab->dev; -+#if LINUX_VERSION_IS_LESS(5,4,0) -+ bool multi_pd_arch; - const char *name; -+#endif - struct rproc *prproc; - phandle rproc_phandle; -- bool multi_pd_arch; - -+#if LINUX_VERSION_IS_LESS(5,4,0) - multi_pd_arch = of_property_read_bool(dev->of_node, "qcom,multipd_arch"); - if (multi_pd_arch) { - if (of_property_read_string(dev->of_node, "qcom,userpd-subsys-name", &name)) -@@ -795,6 +762,7 @@ static int ath11k_core_get_rproc(struct - return -EINVAL; - } - } else { -+#endif - if (of_property_read_u32(dev->of_node, "qcom,rproc", &rproc_phandle)) { - ath11k_err(ab, "failed to get q6_rproc handle\n"); - return -ENOENT; -@@ -805,7 +773,9 @@ static int ath11k_core_get_rproc(struct - ath11k_err(ab, "failed to get rproc\n"); - return -EINVAL; - } -+#if LINUX_VERSION_IS_LESS(5,4,0) - } -+#endif - - ab_ahb->tgt_rproc = prproc; - ---- a/drivers/net/wireless/ath/ath11k/ce.c -+++ b/drivers/net/wireless/ath/ath11k/ce.c -@@ -1107,10 +1107,17 @@ void ce_update_tasklet_time_duration_sta - { - s64 sched_us, exec_us; - -+#if LINUX_VERSION_IS_LESS(5,4,0) - sched_us = (ce_pipe->tasklet_ts.exec_entry_ts.tv64 - - ce_pipe->tasklet_ts.sched_entry_ts.tv64); - exec_us = (ce_pipe->tasklet_ts.exec_complete_ts.tv64 - - ce_pipe->tasklet_ts.exec_entry_ts.tv64); -+#elif LINUX_VERSION_IS_GEQ(5,4,0) -+ sched_us = (ce_pipe->tasklet_ts.exec_entry_ts - -+ ce_pipe->tasklet_ts.sched_entry_ts); -+ exec_us = (ce_pipe->tasklet_ts.exec_complete_ts - -+ ce_pipe->tasklet_ts.exec_entry_ts); -+#endif - - sched_us = div_s64(sched_us, CE_TIME_DURATION_USEC * NSEC_PER_USEC); - if (sched_us > CE_TIME_DURATION_USEC_500) { ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -848,10 +848,9 @@ struct ath11k_num_vdevs_peers { - - struct ath11k_internal_pci { - int qgicm_id; -- bool qgic_enabled; -- struct qgic2_msi *qgic2_msi; - const struct ath11k_msi_config *msi_cfg; -- wait_queue_head_t qgic_msi_waitq; -+ bool gic_enabled; -+ wait_queue_head_t gic_msi_waitq; - }; - - struct ath11k_memory_stats { ---- a/drivers/net/wireless/ath/ath11k/coredump.c -+++ b/drivers/net/wireless/ath/ath11k/coredump.c -@@ -174,7 +174,11 @@ void ath11k_coredump_download_rddm(struc - struct ath11k_dump_segment *segment, *seg_info; - int i, rem_seg_cnt = 0, len, num_seg, seg_sz, qdss_seg_cnt = 1; - -+#if LINUX_VERSION_IS_LESS(5,4,0) - mhi_download_rddm_img(mhi_ctrl, false); -+#elif LINUX_VERSION_IS_GEQ(5,4,0) -+ mhi_download_rddm_image(mhi_ctrl, false); -+#endif - - rddm_img = mhi_ctrl->rddm_image; - fw_img = mhi_ctrl->fbc_image; ---- a/drivers/net/wireless/ath/ath11k/debugfs.c -+++ b/drivers/net/wireless/ath/ath11k/debugfs.c -@@ -2,6 +2,7 @@ - /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. - */ -+#include - - #include "debugfs.h" - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -14,7 +14,6 @@ - #include "debug.h" - #include "qmi.h" - #include --#include - - - #define ATH11K_PCI_BAR_NUM 0 -@@ -438,23 +437,6 @@ static void ath11k_pci_sw_reset(struct a - - #define MAX_MSI_IRQS 32 - --int ath11k_pci_get_qgic_msi_irq(struct ath11k_base *ab, unsigned int vector) --{ -- struct qgic2_msi *qgic2_msi = ab->ipci.qgic2_msi; -- -- if (!qgic2_msi) { -- ath11k_err(ab, "qgic2_msi is NULL\n"); -- return -EINVAL; -- } -- -- if (vector >= MAX_MSI_IRQS) { -- ath11k_err(ab, "irq vector greater than MAX MSI IRQ\n"); -- return -EINVAL; -- } -- return qgic2_msi->msi[vector]; --} --EXPORT_SYMBOL(ath11k_pci_get_qgic_msi_irq); -- - int ath11k_pci_get_msi_irq(struct ath11k_base *ab, unsigned int vector) - { - struct device *dev = ab->dev; -@@ -483,13 +465,7 @@ void ath11k_pci_get_msi_address(struct a - void ath11k_pci_get_qgic_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, - u32 *msi_addr_hi) - { -- struct qgic2_msi *qgic2_msi = ab->ipci.qgic2_msi; -- -- if (!qgic2_msi) { -- ath11k_err(ab, "qgic2_msi is NULL\n"); -- return; -- } -- *msi_addr_lo = qgic2_msi->msi_gicm_addr; -+ *msi_addr_lo = 0; - *msi_addr_hi = 0; - } - EXPORT_SYMBOL(ath11k_pci_get_qgic_msi_address); -@@ -557,13 +533,7 @@ int ath11k_get_user_qgic_msi_assignment( - int *num_vectors, u32 *user_base_data, - u32 *base_vector) - { -- struct qgic2_msi *qgic2_msi = ab->ipci.qgic2_msi; -- struct ath11k_msi_config *msi_cfg = ab->ipci.msi_cfg; -- -- return ath11k_pci_get_user_msi_assignment(ab, msi_cfg, -- qgic2_msi->msi_gicm_base, user_name, -- num_vectors, user_base_data, -- base_vector); -+ return 0; - } - EXPORT_SYMBOL(ath11k_get_user_qgic_msi_assignment); - -@@ -974,7 +944,11 @@ static int ath11k_pci_enable_msi(struct - num_vectors = pci_alloc_irq_vectors(ab_pci->pdev, - msi_config->total_vectors, - msi_config->total_vectors, -+#if LINUX_VERSION_IS_LESS(5,4,0) - PCI_IRQ_NOMSIX); -+#elif LINUX_VERSION_IS_GEQ(5,4,0) -+ PCI_IRQ_LEGACY|PCI_IRQ_MSI); -+#endif - if (num_vectors != msi_config->total_vectors) { - ath11k_err(ab, "failed to get %d MSI vectors, only %d available", - msi_config->total_vectors, num_vectors); -@@ -1313,18 +1287,6 @@ static const struct ath11k_hif_ops ath11 - .get_msi_irq = ath11k_pci_get_msi_irq, - }; - --int ath11k_pci_config_qgic_msi_irq(struct ath11k_base *ab) --{ -- int ret = 0; -- struct qgic2_msi *qgic2_msi = ab->ipci.qgic2_msi; -- struct ath11k_msi_config *msi_cfg = ab->ipci.msi_cfg; -- -- ret = ath11k_config_msi_irq(ab, msi_cfg, -- qgic2_msi->msi_gicm_base); -- return ret; --} --EXPORT_SYMBOL(ath11k_pci_config_qgic_msi_irq); -- - static int ath11k_pci_probe(struct pci_dev *pdev, - const struct pci_device_id *pci_dev) - { ---- a/drivers/net/wireless/ath/ath11k/pci.h -+++ b/drivers/net/wireless/ath/ath11k/pci.h -@@ -169,7 +169,6 @@ int ath11k_pci_get_user_msi_assignment(s - int ath11k_pci_get_msi_irq(struct ath11k_base *ab, unsigned int vector); - void ath11k_pci_write32(struct ath11k_base *ab, u32 offset, u32 value); - u32 ath11k_pci_read32(struct ath11k_base *ab, u32 offset); --int ath11k_pci_config_qgic_msi_irq(struct ath11k_base *ab); - int ath11k_pci_start(struct ath11k_base *ab); - void ath11k_pci_stop(struct ath11k_base *ab); - void ath11k_pci_ext_irq_enable(struct ath11k_base *ab); -@@ -187,7 +186,6 @@ void ath11k_pci_get_ce_msi_idx(struct at - u32 *msi_idx); - void ath11k_pci_config_static_window(struct ath11k_base *ab); - void ath11k_pci_free_irq(struct ath11k_base *ab); --int ath11k_pci_get_qgic_msi_irq(struct ath11k_base *ab, unsigned int vector); - int ath11k_ipci_start(struct ath11k_base *ab); - void ath11k_ipci_write32(struct ath11k_base *ab, u32 offset, u32 value); - u32 ath11k_ipci_read32(struct ath11k_base *ab, u32 offset); ---- a/drivers/net/wireless/ath/ath11k/pktlog.c -+++ b/drivers/net/wireless/ath/ath11k/pktlog.c -@@ -157,7 +157,11 @@ static char *ath_pktlog_getbuf(struct at - - static int pktlog_pgfault(struct vm_area_struct *vma, struct vm_fault *vmf) - { -+#if LINUX_VERSION_IS_LESS(5,4,0) - unsigned long address = (unsigned long)vmf->virtual_address; -+#elif LINUX_VERSION_IS_GEQ(5,4,0) -+ unsigned long address = vmf->address; -+#endif - - if (address == 0UL) - return VM_FAULT_NOPAGE; -@@ -167,7 +171,11 @@ static int pktlog_pgfault(struct vm_are - - get_page(virt_to_page(address)); - vmf->page = virt_to_page(address); -+#if LINUX_VERSION_IS_LESS(5,4,0) - return VM_FAULT_MINOR; -+#elif LINUX_VERSION_IS_GEQ(5,4,0) -+ return 0; -+#endif - } - - static struct vm_operations_struct pktlog_vmops = { ---- a/drivers/net/wireless/ath/ath11k/qmi.c -+++ b/drivers/net/wireless/ath/ath11k/qmi.c -@@ -4408,18 +4408,18 @@ static const struct qmi_ops ath11k_qmi_o - .del_server = ath11k_qmi_ops_del_server, - }; - --static int ath11k_wait_for_qgic_msi(struct ath11k_base *ab) -+static int ath11k_wait_for_gic_msi(struct ath11k_base *ab) - { - int timeout; - - if (ab->hw_rev != ATH11K_HW_QCN6122) - return 0; - -- timeout = wait_event_timeout(ab->ipci.qgic_msi_waitq, -- (ab->ipci.qgic_enabled == 1), -- ATH11K_RCV_QGIC_MSI_HDLR_DELAY); -+ timeout = wait_event_timeout(ab->ipci.gic_msi_waitq, -+ (ab->ipci.gic_enabled == 1), -+ ATH11K_RCV_GIC_MSI_HDLR_DELAY); - if (timeout <= 0) { -- ath11k_warn(ab, "Receive qgic msi handler timed out\n"); -+ ath11k_warn(ab, "Receive gic msi handler timed out\n"); - return -ETIMEDOUT; - } - return 0; -@@ -4478,7 +4478,7 @@ static void ath11k_qmi_driver_event_work - clear_bit(ATH11K_FLAG_CRASH_FLUSH, - &ab->dev_flags); - clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags); -- ret = ath11k_wait_for_qgic_msi(ab); -+ ret = ath11k_wait_for_gic_msi(ab); - if (ret) { - ath11k_warn(ab, - "Failed to get qgic handler for dev %d ret: %d\n", -@@ -4607,7 +4607,7 @@ int ath11k_qmi_init_service(struct ath11 - destroy_workqueue(ab->qmi.event_wq); - return ret; - } -- init_waitqueue_head(&ab->ipci.qgic_msi_waitq); -+ init_waitqueue_head(&ab->ipci.gic_msi_waitq); - return ret; - } - ---- a/drivers/net/wireless/ath/ath11k/qmi.h -+++ b/drivers/net/wireless/ath/ath11k/qmi.h -@@ -63,7 +63,7 @@ - #define QCN6122_USERPD_0 1 - #define QCN6122_USERPD_1 2 - #define QCN6122_DEVICE_BAR_SIZE 0x200000 --#define ATH11K_RCV_QGIC_MSI_HDLR_DELAY (3 * HZ) -+#define ATH11K_RCV_GIC_MSI_HDLR_DELAY (3 * HZ) - - struct ath11k_base; - extern unsigned int ath11k_host_ddr_addr; diff --git a/feeds/wifi-ax/mac80211/patches/qca/321-002-ath11k-use-gic-api-irq-allocation.patch b/feeds/wifi-ax/mac80211/patches/qca/321-002-ath11k-use-gic-api-irq-allocation.patch deleted file mode 100644 index 782b796c4..000000000 --- a/feeds/wifi-ax/mac80211/patches/qca/321-002-ath11k-use-gic-api-irq-allocation.patch +++ /dev/null @@ -1,349 +0,0 @@ -From 0459a4506b6655cd72a876b5296b223134dc3874 Mon Sep 17 00:00:00 2001 -From: Tamizh Chelvam -Date: Wed, 26 May 2021 11:27:25 +0530 -Subject: [PATCH] ath11k: Use gic irq related api for irq allocation - -Use latest GIC irq related API for allocate and request irq -for the radio. - -Signed-off-by: Tamizh Chelvam ---- - drivers/net/wireless/ath/ath11k/ahb.c | 87 +++++++++++++++++++++++++++- - drivers/net/wireless/ath/ath11k/ce.c | 10 +++- - drivers/net/wireless/ath/ath11k/ce.h | 1 + - drivers/net/wireless/ath/ath11k/core.h | 5 ++ - drivers/net/wireless/ath/ath11k/dp.c | 15 ++++- - drivers/net/wireless/ath/ath11k/mhi.c | 1 - - drivers/net/wireless/ath/ath11k/pci.c | 102 ++++++++++++++++++++++++++++++++- - drivers/net/wireless/ath/ath11k/pci.h | 5 ++ - 8 files changed, 218 insertions(+), 8 deletions(-) - ---- a/drivers/net/wireless/ath/ath11k/ahb.c -+++ b/drivers/net/wireless/ath/ath11k/ahb.c -@@ -608,12 +608,26 @@ static int ath11k_ahb_ext_irq_config(str - - static void ath11k_internal_pci_free_irq(struct ath11k_base *ab) - { -+ struct platform_device *pdev = ab->pdev; -+ - ath11k_pci_free_irq(ab); -+ platform_msi_domain_free_irqs(&pdev->dev); -+} -+ -+static void ath11k_gicv2m_msg_handler(struct msi_desc *desc, struct msi_msg *msg) -+{ -+ desc->msg.address_lo = msg->address_lo; -+ desc->msg.address_hi = msg->address_hi; -+ desc->msg.data = msg->data; - } - - static int ath11k_config_irq_internal_pci(struct ath11k_base *ab) - { - int ret; -+ struct platform_device *pdev = ab->pdev; -+ struct msi_desc *msi_desc; -+ bool ce_done = false; -+ int i = 0; - - if (ab->userpd_id != QCN6122_USERPD_0 && - ab->userpd_id != QCN6122_USERPD_1) { -@@ -621,6 +635,74 @@ static int ath11k_config_irq_internal_pc - return -ENODEV; - } - -+ ab->ipci.msi_cfg = &ath11k_msi_config[ATH11K_MSI_CONFIG_QCN6122]; -+ -+ ret = platform_msi_domain_alloc_irqs(&pdev->dev, ab->ipci.msi_cfg->total_vectors, -+ ath11k_gicv2m_msg_handler); -+ if (ret) { -+ ath11k_warn(ab, "failed to alloc irqs %d ab %pM\n", ret, ab); -+ return ret; -+ } -+ -+ for_each_msi_entry(msi_desc, &pdev->dev) { -+ if (!ce_done && i == ab->hw_params.ce_count) { -+ i = 0; -+ ce_done = true; -+ } -+ -+ if (!ce_done && i < ab->hw_params.ce_count) { -+ if (ath11k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR) -+ i++; -+ -+ ret = ath11k_pci_config_gic_msi_irq(ab, pdev, msi_desc, i); -+ if (ret) { -+ ath11k_warn(ab, "failed to request irq %d\n", ret); -+ return ret; -+ } -+ } else { -+ ret = ath11k_pci_ext_config_gic_msi_irq(ab, pdev, msi_desc, i); -+ if (ret) { -+ ath11k_warn(ab, "failed to config ext msi irq %d\n", ret); -+ return ret; -+ } -+ } -+ -+ i++; -+ ab->ipci.address_lo = msi_desc->msg.address_lo; -+ ab->ipci.address_hi = msi_desc->msg.address_hi; -+ -+ if (i == 0 && !ce_done) -+ ab->ipci.gic_ep_base_data = msi_desc->msg.data; -+ -+ } -+ -+ for_each_msi_entry(msi_desc, &pdev->dev) { -+ u32 user_base_data = 0, base_vector = 0; -+ int vector, num_vectors = 0; -+ -+ ret = ath11k_pci_get_user_msi_assignment(ab, ab->ipci.msi_cfg, 0, -+ "DP", &num_vectors, &user_base_data, -+ &base_vector); -+ if (ret < 0) -+ return ret; -+ -+ vector = (i % num_vectors) + base_vector; -+ -+ if (i >= ATH11K_EXT_IRQ_GRP_NUM_MAX) -+ break; -+ -+ if (ab->ipci.dp_irq_num[vector] != msi_desc->irq) -+ continue; -+ -+ ret = ath11k_pci_ext_config_gic_msi_irq(ab, pdev, msi_desc, i); -+ if (ret) { -+ ath11k_warn(ab, "failed to config ext msi irq %d\n", ret); -+ return ret; -+ } -+ -+ i++; -+ } -+ - ab->ipci.gic_enabled = 1; - wake_up(&ab->ipci.gic_msi_waitq); - ---- a/drivers/net/wireless/ath/ath11k/ce.c -+++ b/drivers/net/wireless/ath/ath11k/ce.c -@@ -552,7 +552,10 @@ static void ath11k_ce_srng_msi_ring_para - - ring_params->msi_addr = addr_lo; - ring_params->msi_addr |= (dma_addr_t)(((uint64_t)addr_hi) << 32); -- ring_params->msi_data = (msi_data_idx % msi_data_count) + msi_data_start; -+ if (!ab->userpd_id) -+ ring_params->msi_data = (msi_data_idx % msi_data_count) + msi_data_start; -+ else -+ ring_params->msi_data = ab->ipci.ce_msi_data[ce_id]; - ring_params->flags |= HAL_SRNG_FLAGS_MSI_INTR; - } - ---- a/drivers/net/wireless/ath/ath11k/ce.h -+++ b/drivers/net/wireless/ath/ath11k/ce.h -@@ -7,6 +7,7 @@ - #define ATH11K_CE_H - - #define CE_COUNT_MAX 12 -+#define ATH11K_QCN6122_CE_COUNT 6 - - /* Byte swap data words */ - #define CE_ATTR_BYTE_SWAP_DATA 2 -@@ -192,6 +193,7 @@ struct ath11k_ce_pipe { - struct ce_tasklet_time tracker[CE_TIME_DURATION_MAX]; - u32 sched_delay_gt_500US; - u32 exec_delay_gt_500US; -+ u32 msi_data; - }; - - struct ath11k_ce { ---- a/drivers/net/wireless/ath/ath11k/core.h -+++ b/drivers/net/wireless/ath/ath11k/core.h -@@ -854,6 +854,12 @@ struct ath11k_internal_pci { - const struct ath11k_msi_config *msi_cfg; - bool gic_enabled; - wait_queue_head_t gic_msi_waitq; -+ u32 address_lo; -+ u32 address_hi; -+ u32 dp_msi_data[ATH11K_EXT_IRQ_GRP_NUM_MAX]; -+ u32 ce_msi_data[ATH11K_QCN6122_CE_COUNT]; -+ u32 gic_ep_base_data; -+ u32 dp_irq_num[8]; - }; - - struct ath11k_memory_stats { ---- a/drivers/net/wireless/ath/ath11k/dp.c -+++ b/drivers/net/wireless/ath/ath11k/dp.c -@@ -231,8 +231,14 @@ static void ath11k_dp_srng_msi_setup(str - - ring_params->msi_addr = addr_lo; - ring_params->msi_addr |= (dma_addr_t)(((uint64_t)addr_hi) << 32); -- ring_params->msi_data = (msi_group_number % msi_data_count) -- + msi_data_start; -+ -+ if (!ab->userpd_id) -+ ring_params->msi_data = (msi_group_number % msi_data_count) -+ + msi_data_start; -+ else -+ ring_params->msi_data = ab->ipci.dp_msi_data[msi_group_number]; -+ -+ - ring_params->flags |= HAL_SRNG_FLAGS_MSI_INTR; - } - ---- a/drivers/net/wireless/ath/ath11k/pci.c -+++ b/drivers/net/wireless/ath/ath11k/pci.c -@@ -3,8 +3,8 @@ - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. - */ - -+#include - #include --#include - #include - - #include "pci.h" -@@ -465,7 +465,7 @@ void ath11k_pci_get_msi_address(struct a - void ath11k_pci_get_qgic_msi_address(struct ath11k_base *ab, u32 *msi_addr_lo, - u32 *msi_addr_hi) - { -- *msi_addr_lo = 0; -+ *msi_addr_lo = ab->ipci.address_lo; - *msi_addr_hi = 0; - } - EXPORT_SYMBOL(ath11k_pci_get_qgic_msi_address); -@@ -497,6 +497,7 @@ int ath11k_pci_get_user_msi_assignment(s - - return -EINVAL; - } -+EXPORT_SYMBOL(ath11k_pci_get_user_msi_assignment); - - void ath11k_pci_get_ce_msi_idx(struct ath11k_base *ab, u32 ce_id, - u32 *msi_idx) -@@ -775,11 +776,12 @@ static int ath11k_pci_ext_irq_config(str - { - int i, j, ret, num_vectors = 0; - u32 user_base_data = 0, base_vector = 0, base_idx; -+ struct ath11k_pci *ab_pci = ath11k_pci_priv(ab); - u8 domain_id; - - domain_id = ath11k_pci_get_domain_id(ab); - base_idx = ATH11K_PCI_IRQ_CE0_OFFSET + CE_COUNT_MAX; -- ret = ath11k_pci_get_user_msi_assignment(ab, msi_config, msi_ep_base_data, -+ ret = ath11k_pci_get_user_msi_assignment(ab, ab_pci->msi_config, msi_ep_base_data, - "DP", &num_vectors, &user_base_data, - &base_vector); - if (ret < 0) -@@ -894,6 +896,96 @@ static int ath11k_config_msi_irq(struct - return 0; - } - -+int ath11k_pci_ext_config_gic_msi_irq(struct ath11k_base *ab, struct platform_device *pdev, -+ struct msi_desc *msi_desc, int i) -+{ -+ u32 user_base_data = 0, base_vector = 0, base_idx; -+ struct ath11k_ext_irq_grp *irq_grp; -+ int j, ret = 0, num_vectors = 0; -+ u8 domain_id; -+ u32 num_irq = 0; -+ -+ domain_id = ath11k_pci_get_domain_id(ab); -+ base_idx = ATH11K_PCI_IRQ_CE0_OFFSET + CE_COUNT_MAX; -+ ret = ath11k_pci_get_user_msi_assignment(ab, ab->ipci.msi_cfg, 0, -+ "DP", &num_vectors, &user_base_data, -+ &base_vector); -+ if (ret < 0) -+ return ret; -+ -+ irq_grp = &ab->ext_irq_grp[i]; -+ irq_grp->ab = ab; -+ irq_grp->grp_id = i; -+ init_dummy_netdev(&irq_grp->napi_ndev); -+ netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi, -+ ath11k_pci_ext_grp_napi_poll, NAPI_POLL_WEIGHT); -+ -+ if (ab->hw_params.ring_mask->tx[i] || -+ ab->hw_params.ring_mask->rx[i] || -+ ab->hw_params.ring_mask->rx_err[i] || -+ ab->hw_params.ring_mask->rx_wbm_rel[i] || -+ ab->hw_params.ring_mask->reo_status[i] || -+ ab->hw_params.ring_mask->rxdma2host[i] || -+ ab->hw_params.ring_mask->host2rxdma[i] || -+ ab->hw_params.ring_mask->rx_mon_status[i]) { -+ num_irq = 1; -+ } -+ -+ irq_grp->num_irq = num_irq; -+ irq_grp->irqs[0] = base_idx + i; -+ -+ for (j = 0; j < irq_grp->num_irq; j++) { -+ -+ int irq_idx = irq_grp->irqs[j]; -+ int vector = (i % num_vectors) + base_vector; -+ -+ irq_set_status_flags(msi_desc->irq, IRQ_DISABLE_UNLAZY); -+ ret = devm_request_irq(&pdev->dev, msi_desc->irq, -+ ath11k_pci_ext_interrupt_handler, -+ IRQF_SHARED, dp_irq_name[domain_id][i], -+ irq_grp); -+ if (ret) { -+ ath11k_err(ab, "failed request irq %d: %d\n", -+ irq_idx, ret); -+ return ret; -+ } -+ ab->irq_num[irq_idx] = msi_desc->irq; -+ ab->ipci.dp_irq_num[vector] = msi_desc->irq; -+ ab->ipci.dp_msi_data[i] = msi_desc->msg.data; -+ disable_irq_nosync(ab->irq_num[irq_idx]); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(ath11k_pci_ext_config_gic_msi_irq); -+ -+int ath11k_pci_config_gic_msi_irq(struct ath11k_base *ab, struct platform_device *pdev, -+ struct msi_desc *msi_desc, int i) -+{ -+ struct ath11k_ce_pipe *ce_pipe = &ab->ce.ce_pipe[i]; -+ int irq_idx, ret; -+ u8 domain_id; -+ -+ domain_id = ath11k_pci_get_domain_id(ab); -+ tasklet_setup(&ce_pipe->intr_tq, ath11k_pci_ce_tasklet); -+ irq_idx = ATH11K_PCI_IRQ_CE0_OFFSET + i; -+ -+ ret = devm_request_irq(&pdev->dev, msi_desc->irq, -+ ath11k_pci_ce_interrupt_handler, -+ IRQF_SHARED, ce_irq_name[domain_id][i], -+ ce_pipe); -+ if (ret) { -+ ath11k_warn(ab, "failed to request irq %d: %d\n", -+ irq_idx, ret); -+ return ret; -+ } -+ ab->irq_num[irq_idx] = msi_desc->irq; -+ ab->ipci.ce_msi_data[i] = msi_desc->msg.data; -+ ath11k_pci_ce_irq_disable(ab, i); -+ -+ return ret; -+} -+EXPORT_SYMBOL(ath11k_pci_config_gic_msi_irq); -+ - static int ath11k_pci_config_irq(struct ath11k_base *ab) - { - int ret; ---- a/drivers/net/wireless/ath/ath11k/pci.h -+++ b/drivers/net/wireless/ath/ath11k/pci.h -@@ -6,6 +6,7 @@ - #define _ATH11K_PCI_H - - #include -+#include - - #include "core.h" - -@@ -189,4 +190,8 @@ void ath11k_pci_free_irq(struct ath11k_b - int ath11k_ipci_start(struct ath11k_base *ab); - void ath11k_ipci_write32(struct ath11k_base *ab, u32 offset, u32 value); - u32 ath11k_ipci_read32(struct ath11k_base *ab, u32 offset); -+int ath11k_pci_config_gic_msi_irq(struct ath11k_base *ab, struct platform_device *pdev, -+ struct msi_desc *msi_desc, int i); -+int ath11k_pci_ext_config_gic_msi_irq(struct ath11k_base *ab, struct platform_device *pdev, -+ struct msi_desc *msi_desc, int i); - #endif diff --git a/feeds/wifi-ax/mac80211/patches/qca/342-ath11k-retain-debugfs-during-firmware-recovery.patch b/feeds/wifi-ax/mac80211/patches/qca/342-ath11k-retain-debugfs-during-firmware-recovery.patch deleted file mode 100644 index 9514e52b7..000000000 --- a/feeds/wifi-ax/mac80211/patches/qca/342-ath11k-retain-debugfs-during-firmware-recovery.patch +++ /dev/null @@ -1,381 +0,0 @@ -From 508d7cfbae86d06a580bd92f2e1fc1f88af66f6b Mon Sep 17 00:00:00 2001 -From: P Praneesh -Date: Mon, 10 Jan 2022 16:21:33 +0530 -Subject: [PATCH] ath11k: retain debugfs during firmware recovery - -During core restart, mac80211 add interface invokes debugfs creation -which is not yet destroyed during firmware recovery. Below warning -prints observed during firmware restart. - -debugfs: File 'mac_filter' in directory 'netdev:wlan2' already present! -debugfs: File 'wbm_tx_completion_stats' in directory 'netdev:wlan2' already present! -debugfs: File 'ampdu_aggr_size' in directory 'netdev:wlan2' already present! -debugfs: File 'amsdu_aggr_size' in directory 'netdev:wlan2' already present! -debugfs: File 'wmi_ctrl_stats' in directory 'netdev:wlan2' already present! - -Fix this warning by preventing debugfs re-creation during core restart. - -Signed-off-by: P Praneesh ---- - drivers/net/wireless/ath/ath11k/core.c | 6 +- - drivers/net/wireless/ath/ath11k/debug_smart_ant.c | 27 ++++++++ - drivers/net/wireless/ath/ath11k/debugfs.c | 78 ++++++++++++++++++++++ - .../net/wireless/ath/ath11k/debugfs_htt_stats.c | 7 ++ - drivers/net/wireless/ath/ath11k/dp.c | 7 +- - drivers/net/wireless/ath/ath11k/dp.h | 2 +- - drivers/net/wireless/ath/ath11k/mac.c | 12 ++-- - 7 files changed, 128 insertions(+), 11 deletions(-) - -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/core.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/core.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/core.c -@@ -924,7 +924,7 @@ err_mac_unregister: - err_nss_tear: - ath11k_nss_teardown(ab); - err_dp_pdev_free: -- ath11k_dp_pdev_free(ab); -+ ath11k_dp_pdev_free(ab, true); - err_pdev_debug: - ath11k_debugfs_pdev_destroy(ab); - -@@ -942,7 +942,7 @@ static void ath11k_core_pdev_destroy(str - ab->nss.enabled = false; - - ath11k_hif_irq_disable(ab); -- ath11k_dp_pdev_free(ab); -+ ath11k_dp_pdev_free(ab, true); - ath11k_debugfs_pdev_destroy(ab); - } - -@@ -1224,7 +1224,7 @@ static int ath11k_core_reconfigure_on_cr - #endif - ath11k_thermal_unregister(ab); - ath11k_hif_irq_disable(ab); -- ath11k_dp_pdev_free(ab); -+ ath11k_dp_pdev_free(ab, false); - ath11k_spectral_deinit(ab); - ath11k_cfr_deinit(ab); - ath11k_hif_stop(ab); -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debugfs.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/debugfs.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debugfs.c -@@ -17,6 +17,7 @@ - #include "qmi.h" - - struct dentry *debugfs_ath11k; -+struct dentry *debugfs_debug_infra; - - static const char *htt_bp_umac_ring[HTT_SW_UMAC_RING_IDX_MAX] = { - "REO2SW1_RING", -@@ -258,9 +259,18 @@ static ssize_t ath11k_write_wmi_ctrl_pat - { - struct ath11k_vif *arvif = file->private_data; - struct wmi_ctrl_path_stats_cmd_param param = {0}; -+ struct ath11k *ar = arvif->ar; - u8 buf[128] = {0}; - int ret; - -+ mutex_lock(&ar->conf_mutex); -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ mutex_unlock(&ar->conf_mutex); -+ - ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count); - if (ret < 0) { - return ret; -@@ -609,10 +619,19 @@ static ssize_t ath11k_write_amsdu_aggr_s - { - struct ath11k_vif *arvif = file->private_data; - struct ath11k_base *ab = arvif->ar->ab; -+ struct ath11k *ar = arvif->ar; - unsigned int tx_aggr_size = 0; - int ret; - struct set_custom_aggr_size_params params = {0}; - -+ mutex_lock(&ar->conf_mutex); -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ mutex_unlock(&ar->conf_mutex); -+ - if (kstrtouint_from_user(ubuf, count, 0, &tx_aggr_size)) - return -EINVAL; - -@@ -2059,6 +2078,7 @@ void ath11k_debugfs_destroy() - { - debugfs_remove_recursive(debugfs_ath11k); - debugfs_ath11k = NULL; -+ debugfs_debug_infra = NULL; - } - - void ath11k_debugfs_fw_stats_init(struct ath11k *ar) -@@ -2256,6 +2276,12 @@ static ssize_t ath11k_write_simulate_rad - struct ath11k *ar = file->private_data; - int ret; - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - ret = ath11k_wmi_simulate_radar(ar); - if (ret) - return ret; -@@ -2312,6 +2338,14 @@ static ssize_t ath11k_write_btcoex(struc - if (!ar) - return -EINVAL; - -+ mutex_lock(&ar->conf_mutex); -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ mutex_unlock(&ar->conf_mutex); -+ - buf_size = min(count, (sizeof(buf) - 1)); - if (copy_from_user(buf, ubuf, buf_size)) - return -EFAULT; -@@ -2404,6 +2438,14 @@ static ssize_t ath11k_write_btcoex_duty_ - if (!ar) - return -EINVAL; - -+ mutex_lock(&ar->conf_mutex); -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ mutex_unlock(&ar->conf_mutex); -+ - if (!test_bit(ATH11K_FLAG_BTCOEX, &ar->dev_flags)) - return -EINVAL; - -@@ -2495,6 +2537,12 @@ static ssize_t ath11k_write_btcoex_algo( - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - arvif = list_first_entry(&ar->arvifs, typeof(*arvif), list); - if (!arvif->is_started) { - ret = -EINVAL; -@@ -2685,6 +2733,12 @@ static ssize_t ath11k_write_ps_state_ena - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ ret = -ENETDOWN; -+ goto exit; -+ } -+ - if (ar->ps_state_enable == ps_state_enable) { - ret = count; - goto exit; -@@ -2975,6 +3029,14 @@ static ssize_t ath11k_athdiag_read(struc - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ -+ mutex_unlock(&ar->conf_mutex); -+ - buf = vmalloc(count); - if (!buf) { - ret = -ENOMEM; -@@ -3921,6 +3983,12 @@ static ssize_t ath11k_write_ani_enable(s - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - if (ar->ani_enabled == enable) { - ret = count; - goto exit; -@@ -3976,6 +4044,12 @@ static ssize_t ath11k_write_ani_poll_per - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ANI_POLL_PERIOD, - ani_poll_period, ar->pdev->pdev_id); - if (ret) { -@@ -4026,6 +4100,12 @@ static ssize_t ath11k_write_ani_listen_p - - mutex_lock(&ar->conf_mutex); - -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_ANI_LISTEN_PERIOD, - ani_listen_period, ar->pdev->pdev_id); - if (ret) { -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debugfs_htt_stats.c -@@ -5410,6 +5410,13 @@ static ssize_t ath11k_write_htt_stats_re - return -E2BIG; - - mutex_lock(&ar->conf_mutex); -+ -+ if (ar->state != ATH11K_STATE_ON) { -+ ath11k_warn(ar->ab, "pdev %d not in ON state\n", ar->pdev->pdev_id); -+ mutex_unlock(&ar->conf_mutex); -+ return -ENETDOWN; -+ } -+ - cfg_params.cfg0 = HTT_STAT_DEFAULT_RESET_START_OFFSET; - cfg_params.cfg1 = 1 << (cfg_params.cfg0 + type); - ret = ath11k_dp_tx_htt_h2t_ext_stats_req(ar, -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/dp.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/dp.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/dp.c -@@ -972,7 +972,7 @@ done: - } - EXPORT_SYMBOL(ath11k_dp_service_srng); - --void ath11k_dp_pdev_free(struct ath11k_base *ab) -+void ath11k_dp_pdev_free(struct ath11k_base *ab, bool ureg_dbgfs) - { - struct ath11k *ar; - int i; -@@ -982,7 +982,8 @@ void ath11k_dp_pdev_free(struct ath11k_b - for (i = 0; i < ab->num_radios; i++) { - ar = ab->pdevs[i].ar; - ath11k_dp_rx_pdev_free(ab, i); -- ath11k_debugfs_unregister(ar); -+ if (ureg_dbgfs) -+ ath11k_debugfs_unregister(ar); - ath11k_dp_rx_pdev_mon_detach(ar); - } - } -@@ -1037,7 +1038,7 @@ int ath11k_dp_pdev_alloc(struct ath11k_b - return 0; - - err: -- ath11k_dp_pdev_free(ab); -+ ath11k_dp_pdev_free(ab, true); - - return ret; - } -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/dp.h -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/dp.h -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/dp.h -@@ -1907,7 +1907,7 @@ void ath11k_dp_free(struct ath11k_base * - int ath11k_dp_alloc(struct ath11k_base *ab); - int ath11k_dp_pdev_alloc(struct ath11k_base *ab); - void ath11k_dp_pdev_pre_alloc(struct ath11k_base *ab); --void ath11k_dp_pdev_free(struct ath11k_base *ab); -+void ath11k_dp_pdev_free(struct ath11k_base *ab, bool ureg_dbgfs); - int ath11k_dp_tx_htt_srng_setup(struct ath11k_base *ab, u32 ring_id, - int mac_id, enum hal_ring_type ring_type); - int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr); -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/mac.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/mac.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/mac.c -@@ -6763,7 +6763,11 @@ static int ath11k_mac_op_add_interface(s - goto err; - } - -- ath11k_debugfs_dbg_mac_filter(arvif); -+ if (ar->state != ATH11K_STATE_RESTARTED) { -+ ath11k_debugfs_dbg_mac_filter(arvif); -+ } else { -+ INIT_LIST_HEAD(&arvif->mac_filters); -+ } - - switch (vif->type) { - case NL80211_IFTYPE_UNSPECIFIED: -@@ -6946,6 +6950,14 @@ static int ath11k_mac_op_add_interface(s - if (vif->type != NL80211_IFTYPE_MONITOR && ar->monitor_conf_enabled) - ath11k_mac_monitor_vdev_create(ar); - -+ if (ar->state != ATH11K_STATE_RESTARTED) { -+ ath11k_debug_aggr_size_config_init(arvif); -+ ath11k_debugfs_wmi_ctrl_stats(arvif); -+ } else { -+ INIT_LIST_HEAD(&arvif->ar->debug.wmi_list); -+ init_completion(&arvif->ar->debug.wmi_ctrl_path_stats_rcvd); -+ } -+ - mutex_unlock(&ar->conf_mutex); - - return ret; -@@ -7176,9 +7188,6 @@ static int ath11k_mac_op_ampdu_action(st - break; - } - -- ath11k_debug_aggr_size_config_init(arvif); -- ath11k_debugfs_wmi_ctrl_stats(arvif); -- - mutex_unlock(&ar->conf_mutex); - - return ret; -Index: backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debug_nss.c -=================================================================== ---- backports-20210222_001-4.4.60-b157d2276.orig/drivers/net/wireless/ath/ath11k/debug_nss.c -+++ backports-20210222_001-4.4.60-b157d2276/drivers/net/wireless/ath/ath11k/debug_nss.c -@@ -11,6 +11,8 @@ - #include "debug.h" - #include "debug_nss.h" - -+extern struct dentry *debugfs_debug_infra; -+ - static unsigned int - debug_nss_fill_mpp_dump(struct ath11k_vif *arvif, char *buf, ssize_t size) - { -@@ -908,16 +910,17 @@ void ath11k_debugfs_nss_mesh_vap_create( - - void ath11k_debugfs_nss_soc_create(struct ath11k_base *ab) - { -- struct dentry *debugfs_dbg_infra; -+ if (debugfs_debug_infra) -+ return; - -- debugfs_dbg_infra = debugfs_create_dir("dbg_infra", debugfs_ath11k); -+ debugfs_debug_infra = debugfs_create_dir("dbg_infra", debugfs_ath11k); - - debugfs_create_file("links", 0200, -- debugfs_dbg_infra, ab, -+ debugfs_debug_infra, ab, - &fops_nss_links); - - debugfs_create_file("mpp_mode", 0600, -- debugfs_dbg_infra, ab, -+ debugfs_debug_infra, ab, - &fops_nss_mpp_mode); - } -