From nobody Sat Jun 13 19:06:12 2026 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D7AC277007 for ; Wed, 6 May 2026 01:40:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778031603; cv=none; b=gp6depBTusmvAAqlcFsNFXu+N2R0RU1P2UzdAGcGDwyZzUcz3K+PoVs5Svn4Dr4skxYrOGhEtekQ9q4ahpNCgEOa8V79AeqQ45SaEkOfDFq+nxAtPJpilmhR54rOdy30geRSQUOuzIAZCtqSM1nROvFOqL6F27qRCWmF/9uK8m0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778031603; c=relaxed/simple; bh=P5GGRaMT2aaO6cv++PtfWsFBVuVNFRyIWoxv/wx8yfg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WOWNavO729LTA3DwIOOpISi3+Bz6MQX9h06x8/RviBIIIi8nIihPFf/ImDq/MzDeGr3GGCYFgAsXc8xzeHE91oc3tOZgWzGaL3XfvtzbVGvAuskTocex8rgq5NqhN2UGqWJmeeV3uKvHt5/V/5+rh1HTsF5GCnpWQnr/vSfLrbA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MxWw1EJy; arc=none smtp.client-ip=209.85.208.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MxWw1EJy" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-67c2d57a5ceso5694149a12.3 for ; Tue, 05 May 2026 18:40:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778031600; x=1778636400; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=04ncidu2w9RP0dQrMmKnvCZ7U/5L1OOGEwGtLj11dxw=; b=MxWw1EJyJ6uauqAfxHJf9xfrXi+VFTBOdPLd64SyWLLFQGGsLGdqCSrV6JwYRpOyOI +ovEDpDd9zo6F30u0fwf72fXQ5bktrBmC+mxqpaVYcLCBUdVfgm0xrsYn0iB5aQybo+9 hjJJgLEmJmqvtGqxXXbhHeYbRQArglug0YQ2XCr1rQiYM7k/8V88+wQOF1IB9mys/Qcq Q5IaLFMESHOPgUr2ewC0vZFcSY5i8nQ3jo3DL2D34jZ8IsfFQj8AtzhuellZpRD+fuyO DBMfe7W1QHBFYV8cR3PjkCE8RolGyXXVNFfjqEmoyrXPdci5R5tEar+Ov+k01lURbB6h r8lQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778031600; x=1778636400; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=04ncidu2w9RP0dQrMmKnvCZ7U/5L1OOGEwGtLj11dxw=; b=ct4sOEpB07g076Vl1ZF7f1u+Xo4OjC0D6SZXgTLFpiNlnXq0kkERO+2B6Eq5cqmIEB IYct8i/yIBOFh2ajjSMqElOShXz+59MNx6f+VK7DiWgCghB4uKZxdWXR2yPaL7H+PL88 yW9IkqXleuadjIUN5Mb5ZQuMvtkg3FnS3wFeIh6ljZ2EMHO9OjYHqSBM24p3gchkYwKH EVFWn5fx29//bULXjlLOE8BlH9dfl/QPh8AWEtELh/XENkyl9ky2szAiNhu68h9mMxDl BBo/+hH/BhPg0nLsF5bOSn48sGqfAsTr4ysfFLPzd3zc739J8mUHvNtdpmDQTEdMqIiY J9Og== X-Forwarded-Encrypted: i=1; AFNElJ/VUIJ0yjxbjQlo0wZ4dVzUc8Q03XTtGewW5UGAmr95W8uLwhcF8e7VFGC4KU91P0MyAZD7cZwd190Ebl0=@vger.kernel.org X-Gm-Message-State: AOJu0YzxaeZKuwNPxgEK+7F6H3bmoS+UkRvoYMlbOhF+gik5QMiaEJsQ y+xdVLPCBDpKAxkogPCm96oJQO3iGkokB6iMBU8Yn4jQAfQ3pfcKse8n X-Gm-Gg: AeBDieu9iHmoJlhvh3T2Fti00V9IvlmKa5J8TvCz80owHVYDvR9KkkqJKM+O5FmIcLk PLxlPvrzy4JF4GEcY5ZpBtdDk/2Q6Vbpo00sD9w9CJ7kZacfqStXPHMQwpKNBEZeFEcshkVk8O7 6yIiTaUO3rM+JmJD7mKV1hx2+bVTxhl0rj76PAH8hl0Sqa2Dj/Fhg1iO1JiFQIxLUjnrl3pyIoS w2rx/88BQ5wrO8wMsXbDOwBnGS97rjpsWpVpnCnbHmn/A7YZqaMmvl46335+jSKwkRVFgq9hlWF AEUBGi7DH/of1eSfqN02ulUoIxoKICNdCeEltbDYbBITeOCJJZ0SqRE1bf87wLiWsyvpR/z7edz +fO6f9wTIHauPwS+xteA66B0Bgl3FLACUUkJnzYsqz4VUgQptJc3XEyHuHtuZm20rw5uxC8APq9 6/OPhAaMZTRFvCbx4Xhlw0c/AsObX4SIQGTutZYrUUkfxjlNzqvreZOZjdDrkb0ziKC6KiWbn6v huXm9RUC9nQhR/oJI/XJBhUW3+m08LdjQ== X-Received: by 2002:a05:6402:a58b:20b0:676:d85a:5faf with SMTP id 4fb4d7f45d1cf-67d63d855e2mr287194a12.9.1778031599366; Tue, 05 May 2026 18:39:59 -0700 (PDT) Received: from KURWA.angora-ide.ts.net (mm-195-107-126-178.vitebsk.dynamic.pppoe.byfly.by. [178.126.107.195]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-67cd904fe68sm849388a12.0.2026.05.05.18.39.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 18:39:58 -0700 (PDT) From: ElXreno Date: Wed, 06 May 2026 04:39:15 +0300 Subject: [PATCH v2 1/2] wifi: mt76: route TDLS-peer frames as 3-addr non-DS in HW encap Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260506-mt7925-tdls-fixes-v2-1-46aa826ba8bb@gmail.com> References: <20260506-mt7925-tdls-fixes-v2-0-46aa826ba8bb@gmail.com> In-Reply-To: <20260506-mt7925-tdls-fixes-v2-0-46aa826ba8bb@gmail.com> To: Felix Fietkau , Lorenzo Bianconi , Ryder Lee , Shayne Chen , Sean Wang , Matthias Brugger , AngeloGioacchino Del Regno , Ming Yen Hsieh , Deren Wu Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, ElXreno X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7203; i=elxreno@gmail.com; h=from:subject:message-id; bh=P5GGRaMT2aaO6cv++PtfWsFBVuVNFRyIWoxv/wx8yfg=; b=owJ4nJvAy8zAJXa0WDmKX5v/EeNptSSGzF+z37CkRks8YFK1O3i6MfHWBs38PUVOqrP26k6r3 OJ977nJoS8dpSwMYlwMsmKKLDzn9tbmLKtbMrmeKwNmDisTyBAGLk4BmMgCHoafjDOtp26wYNxz Kzg7cdfWd8xmjgvrFonlvHN9zeFS4GG7lpHhno1S27m34vs2//vjuJ7d1TtvY+Qy2ZzrPQ3bVzT kS7jwAAA/IkcZ X-Developer-Key: i=elxreno@gmail.com; a=openpgp; fpr=0CCEBD7D6CA67EA4937F0A68C573235A0F2B0FE2 With HW TX encap offload enabled, the mt76 firmware builds the 802.11 header for the 802.3 frame using the per-WCID context. For a STATION vif the HDR_TRANS TLV currently sets ToDS=3D1, which makes the firmware default to the BSSID as A1 and emit STA->AP-formatted frames regardless of which peer the WCID points to. For TDLS-paired peers this is wrong. Data frames go on air addressed to the AP, the AP MAC-ACKs and silently drops them per IEEE 802.11z (an AP must not forward to a TDLS-paired peer). Management and control frames bypass the HW encap path and still reach the peer; only user data fails. Add MT_WCID_FLAG_TDLS_PEER, set it in mt7915, mt7921, mt7925 and mt7996 sta-add paths when sta->tdls is true, and override the HDR_TRANS TLV in mt76_connac_mcu_wtbl_hdr_trans_tlv() (Connac2 - mt7915 / mt7921 / mt7922), mt7925_mcu_sta_hdr_trans_tlv() (mt7925) and mt7996_mcu_sta_hdr_trans_tlv() (mt7996) to set ToDS=3D0, FromDS=3D0 when the flag is set. The 3-addr non-DS form matches what 802.11z uses for direct links; the firmware then constructs the frame with A1=3Dpeer rather than A1=3DBSSID. HW encap offload remains enabled for AP and any non-TDLS traffic. Verified on mt7925e + Samsung S938B over a 5 GHz HE 80 MHz channel with iperf3 -t 30 to the TDLS peer: before fix: over the TDLS direct link, 7 TDLS Setup action frames and 3 RTS frames reach the peer; 0 QoS Data frames make it through (mgmt/control paths bypass HW encap, the data path does not). iperf3 stalls. after fix: 2.90 GBytes transferred at 830 Mbit/s sustained, 0 TCP retransmits. mt7915, mt7921, mt7922 and mt7996 are not regression-tested in this change for lack of hardware. Their HDR_TRANS handling mirrors the verified mt7925 change; the firmware behavior is shared across these chips. Signed-off-by: ElXreno Assisted-by: Claude:claude-opus-4-7 bpftrace tcpdump --- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7915/main.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7921/main.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7925/main.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7925/mcu.c | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7996/main.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 5 +++++ 8 files changed, 28 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wirele= ss/mediatek/mt76/mt76.h index 527bef97e122..07955555f84d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -361,6 +361,7 @@ enum mt76_wcid_flags { MT_WCID_FLAG_PS, MT_WCID_FLAG_4ADDR, MT_WCID_FLAG_HDR_TRANS, + MT_WCID_FLAG_TDLS_PEER, }; =20 #define MT76_N_WCIDS 1088 diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers= /net/wireless/mediatek/mt76/mt76_connac_mcu.c index 89bd52ea8bf7..f61d0625ef51 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c @@ -491,6 +491,11 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff= *skb, htr->to_ds =3D true; htr->from_ds =3D true; } + + if (test_bit(MT_WCID_FLAG_TDLS_PEER, &wcid->flags)) { + htr->to_ds =3D false; + htr->from_ds =3D false; + } } EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_hdr_trans_tlv); =20 diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net= /wireless/mediatek/mt76/mt7915/main.c index e1d83052aa6d..51643a48ed15 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c @@ -760,6 +760,9 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ie= ee80211_vif *vif, msta->wcid.phy_idx =3D ext_phy; msta->jiffies =3D jiffies; =20 + if (sta->tdls) + set_bit(MT_WCID_FLAG_TDLS_PEER, &msta->wcid.flags); + ewma_avg_signal_init(&msta->avg_ack_signal); =20 mt7915_mac_wtbl_update(dev, idx, diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net= /wireless/mediatek/mt76/mt7921/main.c index 3d74fabe7408..d39cb881d75e 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c @@ -828,6 +828,9 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ie= ee80211_vif *vif, msta->deflink.last_txs =3D jiffies; msta->deflink.sta =3D msta; =20 + if (sta->tdls) + set_bit(MT_WCID_FLAG_TDLS_PEER, &msta->deflink.wcid.flags); + ret =3D mt76_connac_pm_wake(&dev->mphy, &dev->pm); if (ret) return ret; diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net= /wireless/mediatek/mt76/mt7925/main.c index 73d3722739d0..61330e3c18b2 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c @@ -887,6 +887,9 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mde= v, mlink->wcid.link_valid =3D !!link_sta->sta->valid_links; mlink->sta =3D msta; =20 + if (link_sta->sta->tdls) + set_bit(MT_WCID_FLAG_TDLS_PEER, &mlink->wcid.flags); + wcid =3D &mlink->wcid; ewma_signal_init(&wcid->rssi); rcu_assign_pointer(dev->mt76.wcid[wcid->idx], wcid); diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/= wireless/mediatek/mt76/mt7925/mcu.c index 22bad3cba8df..333cacfaca9c 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c @@ -1091,6 +1091,11 @@ mt7925_mcu_sta_hdr_trans_tlv(struct sk_buff *skb, hdr_trans->to_ds =3D true; hdr_trans->from_ds =3D true; } + + if (test_bit(MT_WCID_FLAG_TDLS_PEER, &wcid->flags)) { + hdr_trans->to_ds =3D false; + hdr_trans->from_ds =3D false; + } } =20 int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev, diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/main.c b/drivers/net= /wireless/mediatek/mt76/mt7996/main.c index a8a6552d49f6..9b8db6efb5ac 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/main.c @@ -1164,6 +1164,9 @@ mt7996_mac_sta_init_link(struct mt7996_dev *dev, msta_link->wcid.link_valid =3D !!sta->valid_links; msta_link->wcid.def_wcid =3D &msta->deflink.wcid; =20 + if (link_sta->sta->tdls) + set_bit(MT_WCID_FLAG_TDLS_PEER, &msta_link->wcid.flags); + ewma_avg_signal_init(&msta_link->avg_ack_signal); ewma_signal_init(&msta_link->wcid.rssi); =20 diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/= wireless/mediatek/mt76/mt7996/mcu.c index 16420375112d..6aaf3ed94221 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c @@ -2139,6 +2139,11 @@ mt7996_mcu_sta_hdr_trans_tlv(struct mt7996_dev *dev,= struct sk_buff *skb, hdr_trans->from_ds =3D true; hdr_trans->mesh =3D true; } + + if (test_bit(MT_WCID_FLAG_TDLS_PEER, &wcid->flags)) { + hdr_trans->to_ds =3D false; + hdr_trans->from_ds =3D false; + } } =20 static enum mcu_mmps_mode --=20 2.53.0 From nobody Sat Jun 13 19:06:12 2026 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 91FEF279DAF for ; Wed, 6 May 2026 01:40:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778031604; cv=none; b=HT3at7E0zAQLMhs5o3DlcvxDHOFkSKkpg/nglg9SgDVjAaHe9bnK7tgEl+F5OjbZFtShmLcF0C0NCTdhE8ZqyCuxM9BHdksXKQ8RVAg1spmsJBLyCo+7tM4bv1EG2pctUmDPepE6rkJ0cWhEYjTZfE1d7iSW2ugB9i9FzQwJIPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778031604; c=relaxed/simple; bh=Gr7EWkvsipUpzm6yGXOHgRC0cyi+bO2nl/KB1dA/mFg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZHA2QIXkxNlLJrJ3tr3ZaA4CSnoaaRKTro5x9TFuRFSSKXC/iLQ9ven+ntHBqCK9ZP0F3vrKpt0ywEvy8fSZt/IzKdqzgDm2DY0z3EU1+piKKcrcUCZQlGiQUSZqXRN4l/uHB0sHAw5KUFOiP8pQON08Jwn6+15QBmfnzmnVjEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lT5rUTZR; arc=none smtp.client-ip=209.85.208.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lT5rUTZR" Received: by mail-ed1-f51.google.com with SMTP id 4fb4d7f45d1cf-67389cf78b0so11589119a12.2 for ; Tue, 05 May 2026 18:40:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778031601; x=1778636401; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=EU+q7eWhkGer8GyP69DC5ptsWUViocS21pDQ3GPfREM=; b=lT5rUTZRSP60ozi3CDhpxL1mPL7V8WE29RKdRfZhQuOAnIWVAc3xIr2AUt1REN4qtB ioZ9NcHB6Sjj+YE61M+r1HbqbpGe4QZ+iVxM1S/uk/qdgENrO1rMqRJh1M5w71psZT+X Pf4ZpfzWW6O4KEWkl225cZopUsvbsVFcEgaqeo/DC19mx+znWbDI1ZAXopbVFL3FRElW lxLW2SZC6UEM+K+5N+kGJnpMwKtgDVPgk/jp8u+1QFx1MjpBsGYCylDwgUdxvH+Til5y orvGrYWUbn7EPPpLQm37f+g44SAKPL9cVyfxJcAAHPbR9VWvflbabGLIfpK3WDDgC+oH spSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778031601; x=1778636401; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=EU+q7eWhkGer8GyP69DC5ptsWUViocS21pDQ3GPfREM=; b=Jh2/HqPi8EZ+yksf4saUhTVHR5I3VohstvE73YfTHyFJLew5C5biB0XviEgjnCaJ26 AY61ePgfm3h0mqzyFLG/ha4RNLxQuvEQvfpDbnbZTKeKZ2eqB3Ttl0mfikk87YeZ/Y7y 3beYgmKJok0B5Jh0MWdqYlqAC9QtvTx3BeOwJvNHtcvPwkNYZnWF0t6Zu3DVvVriF4E/ mykU9BdfsWDo+wCZArIwiO5QmEMIE3qKd2eAms2iIO56pNipezOwUrJdS3pGGhWUXriU gaCfHUgC1JQiGXvx6ckuJVsiGvsgiw673ggMmXJhlHKEqqUm4agtDkLUmhEAHBG//wf5 1oVw== X-Forwarded-Encrypted: i=1; AFNElJ9MJF3EZ6C5JigqNQC1YmCnolC4yhf5Vksll1YBokhOjG+mEEJvyrJf2ISpC9JE6tHCHUQfTtEA9LN64B8=@vger.kernel.org X-Gm-Message-State: AOJu0YyyhPA95rCBK+8vWiyub1hg6wpoKKQPI1pH6tLGBh4X+voMAthM 9jVVDwV3XTCBpQCWyVV5g7unpaEBCcxSZ7QmL1cvMsg1wKqMzJ4iBJIu X-Gm-Gg: AeBDiesqmVIy9MJbTkk2cjoQMo/DZUwmCbS02RgprUCgoGmwBXF6lQDk4/MiG/2aZ4y fLVGUL9GUAosfKtdeB/wc+9tKfCJ2t/e/moDdzaFMDIDIfOmMxXoIwIwsJRKbkHYMR9ZBLXEB2u NJRXjiGNFiStuqJcW5xoo3kLrmwufaZloFYPd1+eSeKZ9s02U0FojIg1dflYZ5p/SIYBfxlNP1f xDPV4xTtE/hJynEgR7bAECtqUTu96+YFIDg8gfHzyMDWjAa7LPZA6jO0VVcWqwZwNlI6HlEVr5y 0fROXXXrTe6iIUeJv54TFB5JcQ5JRWZlfYja+T+6emMC/FFDq9fh8jJLvmlMOfMyUl05Dxa6Wy9 rIvc7/vp1ZLBAGL2cIwSUrqsdmVS4VPlAcpVH9J3kzNQ1Hy9dyIZ1YZJVBWCHbf0jtezIf0lW4T kAM4FP0DOIISYJzVc4LMBbTrOXbqBMKv/hnAWViA22sERBvP9+gsEE/2cJkT21PTWE6Z4/ekSMd nt4W6+0C892HX52lAS6R5aTBxbziU82Eyedpg70qR2W X-Received: by 2002:aa7:da97:0:b0:67b:790e:bf12 with SMTP id 4fb4d7f45d1cf-67d642c098cmr294960a12.12.1778031600972; Tue, 05 May 2026 18:40:00 -0700 (PDT) Received: from KURWA.angora-ide.ts.net (mm-195-107-126-178.vitebsk.dynamic.pppoe.byfly.by. [178.126.107.195]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-67cd904fe68sm849388a12.0.2026.05.05.18.39.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 18:40:00 -0700 (PDT) From: ElXreno Date: Wed, 06 May 2026 04:39:16 +0300 Subject: [PATCH v2 2/2] wifi: mt76: mt7925: don't disable AP BSS when removing TDLS peer Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260506-mt7925-tdls-fixes-v2-2-46aa826ba8bb@gmail.com> References: <20260506-mt7925-tdls-fixes-v2-0-46aa826ba8bb@gmail.com> In-Reply-To: <20260506-mt7925-tdls-fixes-v2-0-46aa826ba8bb@gmail.com> To: Felix Fietkau , Lorenzo Bianconi , Ryder Lee , Shayne Chen , Sean Wang , Matthias Brugger , AngeloGioacchino Del Regno , Ming Yen Hsieh , Deren Wu Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, ElXreno , stable@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2827; i=elxreno@gmail.com; h=from:subject:message-id; bh=Gr7EWkvsipUpzm6yGXOHgRC0cyi+bO2nl/KB1dA/mFg=; b=owJ4nJvAy8zAJXa0WDmKX5v/EeNptSSGzF+z37i4btCS8Hxb1Jjfq5GaszDbxFTh898l1w1sQ pn37H/EGNpRysIgxsUgK6bIwnNub23Osrolk+u5MmDmsDKBDGHg4hSAiewpZvhneTPCnv9UuPQc l8k1B5Juay1R3BVzXovxruVS1ZBrrMkhjAznmaYfWXBieixbQsqpA1N445dZTxbw/yXbrpVXMDH K1IQbAIBdQ48= X-Developer-Key: i=elxreno@gmail.com; a=openpgp; fpr=0CCEBD7D6CA67EA4937F0A68C573235A0F2B0FE2 On a STATION vif, removing a TDLS peer takes the mt7925_mac_sta_remove -> mt7925_mac_sta_remove_links path. The first loop in that function calls mt7925_mcu_add_bss_info(..., enable=3Dfalse) for every link of the station being removed. For a non-MLO STATION vif there is exactly one link, link 0, whose bss_conf is the AP's. TDLS peers do not have their own bss_conf - they share the AP's BSS. The result is that every TDLS peer teardown sends a BSS_INFO_UPDATE with enable=3D0 for the AP's BSS to the firmware, which wipes the AP-side rate-control context. The connection stays associated and TX from the host still works at the negotiated rate, but the AP's downlink to us collapses to the lowest mandatory OFDM rate (HE-MCS 0 / 6 Mbit/s OFDM) and only slowly recovers as rate adaptation re-learns under sustained traffic. With brief or bursty traffic the link can stay at 6-72 Mbit/s indefinitely, requiring a manual reconnect. mt7925_mac_link_sta_remove() already guards its own mt7925_mcu_add_bss_info(..., false) call with "vif->type =3D=3D NL80211_IFTYPE_STATION && !link_sta->sta->tdls". Add the equivalent guard at the top of the cleanup loop in mt7925_mac_sta_remove_links(), above the link_sta / link_conf / mlink / mconf lookups, so TDLS peer teardown skips the loop body entirely without doing the per-link work that would just be thrown away. Verified on mt7925e by triggering Samsung-S938B auto-TDLS via iperf3 and watching iw rx bitrate after teardown: Before: rx bitrate collapses to 6.0-72.0 Mbit/s, oscillates 17/72/ 137/288/432 Mbit/s for 30+ seconds, no full recovery without a manual reassoc. After: rx bitrate stays at 1200.9 Mbit/s HE-MCS 11 NSS 2 80 MHz across the entire TDLS lifecycle. bpftrace confirms a single mt7925_mcu_add_bss_info(enable=3D0) call per teardown before the fix; zero such calls after. Fixes: 3878b4333602 ("wifi: mt76: mt7925: update mt7925_mac_link_sta_[add, = assoc, remove] for MLO") Cc: stable@vger.kernel.org Signed-off-by: ElXreno Assisted-by: Claude:claude-opus-4-7 bpftrace --- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net= /wireless/mediatek/mt76/mt7925/main.c index 61330e3c18b2..041d06143ef1 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c @@ -1268,6 +1268,9 @@ mt7925_mac_sta_remove_links(struct mt792x_dev *dev, s= truct ieee80211_vif *vif, if (vif->type =3D=3D NL80211_IFTYPE_AP) break; =20 + if (vif->type =3D=3D NL80211_IFTYPE_STATION && sta->tdls) + continue; + link_sta =3D mt792x_sta_to_link_sta(vif, sta, link_id); if (!link_sta) continue; --=20 2.53.0