[PATCH] wifi: ath10k: don't reset TxBF on disassociation
From: Fabricio Akio via B4 Relay
Date: Sun Oct 11 2026 - 17:59:16 EST
From: Fabricio Akio <fabricioakio@xxxxxxxxx>
WCN3990 firmware WLAN.HL.1.0.1.c2-00498 crashes whenever the vdev's
TxBF parameter is set while the vdev has no peer for its AP, whatever
the value. ath10k_bss_disassoc() sets it to 0 once the AP's peer is
gone. The firmware therefore crashes on every disconnect, including
the one cfg80211 makes before a suspend without WoWLAN, and whenever
mac80211 replays the state of an interface that is not associated, as
on resume from such a suspend and after a firmware restart. Each
restart replays it again, so the firmware never comes back:
qcom-q6v5-mss 4080000.remoteproc: fatal error received:
err_qdi.c:459:EX:wlan_process:1:WLAN RT:107b:PC=b00c8334
The reset is not needed: ath10k_bss_assoc() sets TxBF again from the
next AP's capabilities before bringing the vdev up. Drop it.
Fixes: 139e170da98a ("ath10k: add TxBF support")
Signed-off-by: Fabricio Akio <fabricioakio@xxxxxxxxx>
---
Tested on a Motorola Moto X4 (SDM630, WCN3990): without this patch a
disconnect, s2idle without an association and a forced modem restart
crashed the firmware every time; with it, none of those did, nor
s2idle while associated.
QCA6174 and QCA9377 also send this command and are untested here.
Qualcomm's qcacld-3.0, ath11k and ath12k do not send TxBF on
disassociation. A WCN3990-only hw_params flag was considered, but
association rewrites the parameter on every chip, so the patch drops
the reset for all of them.
---
drivers/net/wireless/ath/ath10k/mac.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 8e604697d6c2..30355c598f97 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -3190,7 +3190,6 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
{
struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = (void *)vif->drv_priv;
- struct ieee80211_sta_vht_cap vht_cap = {};
int ret;
lockdep_assert_held(&ar->conf_mutex);
@@ -3204,14 +3203,6 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
arvif->vdev_id, ret);
arvif->def_wep_key_idx = -1;
-
- ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
- if (ret) {
- ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
- arvif->vdev_id, ret);
- return;
- }
-
arvif->is_up = false;
ath10k_mac_txpower_recalc(ar);
---
base-commit: becb95e45ef0dda9ffb35156d909d3da7a2789c3
change-id: 20261011-ath10k-disassoc-txbf-e5b77256c647
Best regards,
--
Fabricio Akio <fabricioakio@xxxxxxxxx>