From b21b98627dcd6c1868d13964f6d84e8d43ae9ef7 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 25 May 2022 22:07:10 +0200 Subject: [PATCH 1/6] ipq40xx: add Aruba AP-365 specific BDF Aruba deploys a BDF in the root filesystem, however this matches the one used for the DK04 reference board. The board-specific BDFs are built into the kernel. The AP-365 shows sinificant degraded performance with increased range when used with the reference BDF. Replace the BDF with the one extracted from Arubas kernel. Signed-off-by: David Bauer --- package/firmware/ipq-wifi/Makefile | 2 ++ .../ipq-wifi/board-aruba_ap-365.qca4019 | Bin 0 -> 24316 bytes .../arch/arm/boot/dts/qcom-ipq4029-ap-365.dts | 9 +++++++++ target/linux/ipq40xx/image/generic.mk | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 package/firmware/ipq-wifi/board-aruba_ap-365.qca4019 diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile index cd155473bb..f8445f0e33 100644 --- a/package/firmware/ipq-wifi/Makefile +++ b/package/firmware/ipq-wifi/Makefile @@ -25,6 +25,7 @@ endef # ALLWIFIBOARDS:= \ + aruba_ap-365 \ devolo_magic-2-wifi-next \ edgecore_ecw5410 \ edgecore_oap100 \ @@ -96,6 +97,7 @@ endef # Place files in this directory as board-. # Add $(eval $(call generate-ipq-wifi-package,,)) +$(eval $(call generate-ipq-wifi-package,aruba_ap-365,Aruba AP-365)) $(eval $(call generate-ipq-wifi-package,devolo_magic-2-wifi-next,devolo Magic 2 WiFi next)) $(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410)) $(eval $(call generate-ipq-wifi-package,edgecore_oap100,Edgecore OAP100)) diff --git a/package/firmware/ipq-wifi/board-aruba_ap-365.qca4019 b/package/firmware/ipq-wifi/board-aruba_ap-365.qca4019 new file mode 100644 index 0000000000000000000000000000000000000000..7fc44a64a3b68dc0927cb68f5995a13c134e1471 GIT binary patch literal 24316 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 literal 0 HcmV?d00001 diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4029-ap-365.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4029-ap-365.dts index d3cc73f388..1f7b37d56d 100644 --- a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4029-ap-365.dts +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4029-ap-365.dts @@ -208,3 +208,12 @@ }; }; }; + +&wifi0 { + qcom,ath10k-calibration-variant = "Aruba-AP-365"; +}; + +&wifi1 { + qcom,ath10k-calibration-variant = "Aruba-AP-365"; +}; + diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk index b730a0e184..44880d157c 100644 --- a/target/linux/ipq40xx/image/generic.mk +++ b/target/linux/ipq40xx/image/generic.mk @@ -185,7 +185,7 @@ TARGET_DEVICES += aruba_ap-303h define Device/aruba_ap-365 $(call Device/aruba_glenmorangie) DEVICE_MODEL := AP-365 - DEVICE_PACKAGES += kmod-hwmon-ad7418 + DEVICE_PACKAGES := kmod-hwmon-ad7418 ipq-wifi-aruba_ap-365 endef TARGET_DEVICES += aruba_ap-365 From 38a5b593ef9e94deedefb627f1952b3bb881df56 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 31 May 2022 14:01:21 +0200 Subject: [PATCH 2/6] kernel: fix crashes in bridge offload code - fix an issues when accessing the port pointer of an expired/invalid fdb entry Signed-off-by: Felix Fietkau --- .../linux/generic/hack-5.10/600-bridge_offload.patch | 10 +++++----- .../linux/generic/hack-5.15/600-bridge_offload.patch | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/target/linux/generic/hack-5.10/600-bridge_offload.patch b/target/linux/generic/hack-5.10/600-bridge_offload.patch index 586353816c..7e1b852bf3 100644 --- a/target/linux/generic/hack-5.10/600-bridge_offload.patch +++ b/target/linux/generic/hack-5.10/600-bridge_offload.patch @@ -434,13 +434,13 @@ + vg = nbp_vlan_group_rcu(inp); + vlan = cb->input_vlan_present ? cb->input_vlan_tag : br_get_pvid(vg); + fdb_in = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_source, vlan); -+ if (!fdb_in) ++ if (!fdb_in || !fdb_in->dst) + goto out; + + vg = nbp_vlan_group_rcu(p); + vlan = skb_vlan_tag_present(skb) ? skb_vlan_tag_get_id(skb) : br_get_pvid(vg); + fdb_out = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_dest, vlan); -+ if (!fdb_out) ++ if (!fdb_out || !fdb_out->dst) + goto out; + + br_offload_prepare_key(p, &key, skb); @@ -450,7 +450,7 @@ +#endif + + flow = kmem_cache_alloc(offload_cache, GFP_ATOMIC); -+ flow->port = fdb_in->dst; ++ flow->port = inp; + memcpy(&flow->key, &key, sizeof(key)); + +#ifdef CONFIG_BRIDGE_VLAN_FILTERING @@ -465,7 +465,7 @@ + spin_lock_bh(&offload_lock); + if (!o->enabled || + atomic_read(&p->offload.rht.nelems) >= p->br->offload_cache_size || -+ rhashtable_insert_fast(&flow->port->offload.rht, &flow->node, flow_params)) { ++ rhashtable_insert_fast(&inp->offload.rht, &flow->node, flow_params)) { + kmem_cache_free(offload_cache, flow); + goto out_unlock; + } @@ -511,8 +511,8 @@ +#ifdef CONFIG_BRIDGE_VLAN_FILTERING + cb->input_vlan_present = key.vlan_present != 0; + cb->input_vlan_tag = key.vlan_tag; -+ cb->input_ifindex = p->dev->ifindex; +#endif ++ cb->input_ifindex = p->dev->ifindex; + goto out; + } + diff --git a/target/linux/generic/hack-5.15/600-bridge_offload.patch b/target/linux/generic/hack-5.15/600-bridge_offload.patch index c7942a0aef..b396d748b6 100644 --- a/target/linux/generic/hack-5.15/600-bridge_offload.patch +++ b/target/linux/generic/hack-5.15/600-bridge_offload.patch @@ -434,13 +434,13 @@ + vg = nbp_vlan_group_rcu(inp); + vlan = cb->input_vlan_present ? cb->input_vlan_tag : br_get_pvid(vg); + fdb_in = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_source, vlan); -+ if (!fdb_in) ++ if (!fdb_in || !fdb_in->dst) + goto out; + + vg = nbp_vlan_group_rcu(p); + vlan = skb_vlan_tag_present(skb) ? skb_vlan_tag_get_id(skb) : br_get_pvid(vg); + fdb_out = br_fdb_find_rcu(p->br, eth_hdr(skb)->h_dest, vlan); -+ if (!fdb_out) ++ if (!fdb_out || !fdb_out->dst) + goto out; + + br_offload_prepare_key(p, &key, skb); @@ -450,7 +450,7 @@ +#endif + + flow = kmem_cache_alloc(offload_cache, GFP_ATOMIC); -+ flow->port = fdb_in->dst; ++ flow->port = inp; + memcpy(&flow->key, &key, sizeof(key)); + +#ifdef CONFIG_BRIDGE_VLAN_FILTERING @@ -465,7 +465,7 @@ + spin_lock_bh(&offload_lock); + if (!o->enabled || + atomic_read(&p->offload.rht.nelems) >= p->br->offload_cache_size || -+ rhashtable_insert_fast(&flow->port->offload.rht, &flow->node, flow_params)) { ++ rhashtable_insert_fast(&inp->offload.rht, &flow->node, flow_params)) { + kmem_cache_free(offload_cache, flow); + goto out_unlock; + } @@ -511,8 +511,8 @@ +#ifdef CONFIG_BRIDGE_VLAN_FILTERING + cb->input_vlan_present = key.vlan_present != 0; + cb->input_vlan_tag = key.vlan_tag; -+ cb->input_ifindex = p->dev->ifindex; +#endif ++ cb->input_ifindex = p->dev->ifindex; + goto out; + } + From 9a93b62f315ad4c9f021c414ed80ba337ab4a01e Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 27 Mar 2022 00:05:49 +0100 Subject: [PATCH 3/6] mac80211: add a bug fix for a rare crash Signed-off-by: Felix Fietkau --- ...wake-queues-on-a-vif-that-is-being-s.patch | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch diff --git a/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch b/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch new file mode 100644 index 0000000000..f0150ddef0 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/328-mac80211-do-not-wake-queues-on-a-vif-that-is-being-s.patch @@ -0,0 +1,38 @@ +From: Felix Fietkau +Date: Sat, 26 Mar 2022 23:58:35 +0100 +Subject: [PATCH] mac80211: do not wake queues on a vif that is being stopped + +When a vif is being removed and sdata->bss is cleared, __ieee80211_wake_txqs +can still be called on it, which crashes as soon as sdata->bss is being +dereferenced. +To fix this properly, check for SDATA_STATE_RUNNING before waking queues, +and take the fq lock when setting it (to ensure that __ieee80211_wake_txqs +observes the change when running on a different CPU + +Signed-off-by: Felix Fietkau +--- + +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -377,7 +377,9 @@ static void ieee80211_do_stop(struct iee + bool cancel_scan; + struct cfg80211_nan_func *func; + ++ spin_lock_bh(&local->fq.lock); + clear_bit(SDATA_STATE_RUNNING, &sdata->state); ++ spin_unlock_bh(&local->fq.lock); + + cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; + if (cancel_scan) +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -301,6 +301,9 @@ static void __ieee80211_wake_txqs(struct + local_bh_disable(); + spin_lock(&fq->lock); + ++ if (!test_bit(SDATA_STATE_RUNNING, &sdata->state)) ++ goto out; ++ + if (sdata->vif.type == NL80211_IFTYPE_AP) + ps = &sdata->bss->ps; + From 4e1916f71aece40a3b5e8dd8328110fb74c48928 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 4 May 2022 12:49:07 +0200 Subject: [PATCH 4/6] mt76: update to the latest version 6da21a0b7280 linux-firmware: update firmware for MT7921 WiFi device 4876688c41dc linux-firmware: update firmware for MT7915 79b1b86040de linux-firmware: add firmware for MT7986 784c27b159b9 linux-firmware: add firmware for MT7922 079e41dc71a1 mt76: mt7915: configure soc clocks in mt7986_wmac_init 747c70fc6c89 mt76: connac: use skb_put_data instead of open coding e98f58815018 mt76: mt7915: update mt7986 patch in mt7986_wmac_adie_patch_7976() b7104b4b2f2d mt76: mt7915: fix twt table_mask to u16 in mt7915_dev d39368f336ee mt76: mt7915: reject duplicated twt flows 4718ed04a655 mt76: mt7915: limit minimum twt duration 84319691b742 mt76: mt7915: reowrk SER debugfs knob bac5f22365a2 mt76: mt7915: introduce mt7915_mac_severe_check() 81524067686c mt76: mt7915: move MT_INT_MASK_CSR to init.c 2b7f5e85290e mt76: mt7915: add support for 6G in-band discovery 31273183ea0a mt76: mt7615/mt7915: do reset_work with mt76's work queue bb54f5e1c115 mt76: mt7915: improve error handling for fw_debug knobs 838529da6470 mt76: mt7915: add more statistics from fw_util debugfs knobs 3a65deb93737 mt76: add gfp to mt76_mcu_msg_alloc signature 8e87669eefcf mt76: mt7921: add ipv6 NS offload support e1b2c18eee29 mt76: mt7915: fix endianness in mt7915_rf_regval_get 0742eaeafee2 mt76: mt76x02u: fix possible memory leak in __mt76x02u_mcu_send_msg d299ad96d867 mt76: mt7915: fix endian bug in mt7915_rf_regval_set() 380eac6f31ec mt76: add 6 GHz band support in mt76_sar_freq_ranges 268ce38e9e36 mt76: mt7921: introduce ACPI SAR support 8c27300b4271 mt76: mt7921: introduce ACPI SAR config in tx power 54b6504a3ef8 mt76: mt7915: add more ethtool stats cdd66d642977 mt76: add DBDC rxq handlings into mac_reset_work b284684f5cba mt76: mt7921: add PATCH_FINISH_REQ cmd response handling f8b9be4287cc mt76: mt7921s: fix firmware download random fail 28b19d2cc53f mt76: mt7915: add missing bh-disable around tx napi enable/schedule 1d8af168e86f mt76: mt7615: add missing bh-disable around rx napi enable/schedule Signed-off-by: Felix Fietkau --- package/kernel/mt76/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index cc66193109..eb5f71f759 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/openwrt/mt76 PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2022-04-23 -PKG_SOURCE_VERSION:=a666d5637bc3afd3e310be09fac048906560097b -PKG_MIRROR_HASH:=1a7f7a36e5e376d1b18da98c7939f980855f1981be0c3ad7024360dee702c9f8 +PKG_SOURCE_DATE:=2022-06-02 +PKG_SOURCE_VERSION:=1d8af168e86fa4087351b7d10572accd5dee4d36 +PKG_MIRROR_HASH:=5ffd53150c57f378a3ff90e5acc15b9c3321916c4cf5a5698cff03469e6fdab4 PKG_MAINTAINER:=Felix Fietkau PKG_USE_NINJA:=0 From 197b672c40613a53a78a568a1957f2c23c343c1f Mon Sep 17 00:00:00 2001 From: Xu Wang Date: Fri, 27 May 2022 22:21:43 +0000 Subject: [PATCH 5/6] kernel: crypto: add kmod-crypto-chacha20poly1305 Needed by strongSwan IPsec VPN for strongswan-mod-chapoly. Not to be confused with kmod-crypto-LIB-chacha20poly1305, which is an 8-byte nonce version used by wireguard. Signed-off-by: Xu Wang --- package/kernel/linux/modules/crypto.mk | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/package/kernel/linux/modules/crypto.mk b/package/kernel/linux/modules/crypto.mk index 6fd53f6080..cf2cf6c3ac 100644 --- a/package/kernel/linux/modules/crypto.mk +++ b/package/kernel/linux/modules/crypto.mk @@ -101,6 +101,18 @@ endef $(eval $(call KernelPackage,crypto-ccm)) +define KernelPackage/crypto-chacha20poly1305 + TITLE:=ChaCha20-Poly1305 AEAD support, RFC7539 (used by strongSwan IPsec VPN) + DEPENDS:=+kmod-crypto-aead +kmod-crypto-manager + KCONFIG:=CONFIG_CRYPTO_CHACHA20POLY1305 + FILES:=$(LINUX_DIR)/crypto/chacha20poly1305.ko + AUTOLOAD:=$(call AutoLoad,09,chacha20poly1305) + $(call AddDepends/crypto) +endef + +$(eval $(call KernelPackage,crypto-chacha20poly1305)) + + define KernelPackage/crypto-cmac TITLE:=Support for Cipher-based Message Authentication Code (CMAC) DEPENDS:=+kmod-crypto-hash From ce90ba1f3168e3f4581fd8581e2c0cd31efa14cf Mon Sep 17 00:00:00 2001 From: Stijn Tintel Date: Tue, 17 May 2022 17:57:07 +0300 Subject: [PATCH 6/6] ramips: use hotplug script for EAP615-Wall MACs Using nvmem-cells to set the MAC address for a DBDC device results in both PHY devices using the same MAC address. This in turn will result in multiple BSSes using the same BSSID, which can cause various problems. Use the hotplug script for the EAP615-Wall instead to avoid this. Fixes: a1b8a4d7b3ff ("ramips: support TP-Link EAP615-Wall") Signed-off-by: Stijn Tintel Tested-by: Stijn Segers Tested-By: Andrew Powers-Holmes --- target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts | 2 -- .../mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts index a0c3912d8e..0be4af39e8 100644 --- a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts @@ -144,8 +144,6 @@ compatible = "mediatek,mt76"; reg = <0x0000 0 0 0 0>; mediatek,mtd-eeprom = <&radio 0x0>; - nvmem-cells = <&macaddr_info_8>; - nvmem-cell-names = "mac-address"; }; }; diff --git a/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac b/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac index a35e9dcc28..5b12416872 100644 --- a/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac +++ b/target/linux/ramips/mt7621/base-files/etc/hotplug.d/ieee80211/10_fix_wifi_mac @@ -90,6 +90,10 @@ case "$board" in hw_mac_addr="$(mtd_get_mac_binary factory 0x4)" [ "$PHYNBR" = "1" ] && macaddr_add $hw_mac_addr "0x100000" > /sys${DEVPATH}/macaddress ;; + tplink,eap615-wall-v1) + hw_mac_addr="$(mtd_get_mac_binary product-info 0x8)" + macaddr_add "$hw_mac_addr" "$PHYNBR" > "/sys${DEVPATH}/macaddress" + ;; yuncore,ax820) [ "$PHYNBR" = "1" ] && \ macaddr_setbit_la "$(mtd_get_mac_binary Factory 0xe000)" > /sys${DEVPATH}/macaddress