blob: 6edeabedcbd382cf4e2d014d940042504ac9913d [file] [log] [blame]
developer617abbd2024-04-23 14:50:01 +08001From 1f35388fa6214a36e5f7a4770c248a187a543019 Mon Sep 17 00:00:00 2001
2From: Shayne Chen <shayne.chen@mediatek.com>
3Date: Mon, 4 Dec 2023 11:57:38 +0800
4Subject: [PATCH 095/116] wifi: mt76: mt7996: rework TXS for multi-link support
5
6This is a preliminary patch to add MLO support for mt7996 chipsets.
7
8Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com>
9Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
10Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
11---
12 mt7996/mac.c | 9 +++++----
13 mt7996/main.c | 1 +
14 mt7996/mt7996.h | 28 ++++++++++++++++++++++++++++
15 3 files changed, 34 insertions(+), 4 deletions(-)
16
17diff --git a/mt7996/mac.c b/mt7996/mac.c
18index 0fa3266cc..65431c7d7 100644
19--- a/mt7996/mac.c
20+++ b/mt7996/mac.c
21@@ -1192,7 +1192,7 @@ mt7996_mac_add_txs_skb(struct mt7996_dev *dev, struct mt76_wcid *wcid,
22 struct ieee80211_sta *sta;
23 u8 tid;
24
25- sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
26+ sta = wcid_to_sta(wcid);
27 tid = FIELD_GET(MT_TXS0_TID, txs);
28 ieee80211_refresh_tx_agg_session_timer(sta, tid);
29 }
30@@ -1310,9 +1310,10 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
31 struct mt76_wcid *wcid;
32 __le32 *txs_data = data;
33 u16 wcidx;
34- u8 pid;
35+ u8 band, pid;
36
37 wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID);
38+ band = le32_get_bits(txs_data[2], MT_TXS2_BAND);
39 pid = le32_get_bits(txs_data[3], MT_TXS3_PID);
40
41 if (pid < MT_PACKET_ID_NO_SKB)
42@@ -1323,7 +1324,7 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
43
44 rcu_read_lock();
45
46- wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
47+ wcid = mt7996_get_link_wcid(dev, wcidx, band);
48 if (!wcid)
49 goto out;
50
51@@ -1332,7 +1333,7 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
52 if (!wcid->sta)
53 goto out;
54
55- mlink = container_of(wcid, struct mt7996_link_sta, wcid);
56+ mlink = wcid_to_mlink(wcid);
57 spin_lock_bh(&dev->mt76.sta_poll_lock);
58 if (list_empty(&mlink->wcid.poll_list))
59 list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
60diff --git a/mt7996/main.c b/mt7996/main.c
61index 3bd97d4aa..aceb77ab2 100644
62--- a/mt7996/main.c
63+++ b/mt7996/main.c
64@@ -2317,6 +2317,7 @@ mt7996_assign_vif_chanctx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
65 mconf = mconf_dereference_protected(mvif, link_id);
66 mconf->chanctx = ctx;
67 ctx->nbss_assigned++;
68+ mvif->band_to_link[phy->mt76->band_idx] = link_id;
69
70 if (mt7996_hw_phy(hw) == phy)
71 mvif->master_link_id = link_id;
72diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
73index 21a95c146..c6ca00f1a 100644
74--- a/mt7996/mt7996.h
75+++ b/mt7996/mt7996.h
76@@ -357,6 +357,8 @@ struct mt7996_vif {
77 u8 master_link_id;
78 u8 group_mld_id;
79 u8 mld_remap_id;
80+
81+ u8 band_to_link[__MT_MAX_BAND];
82 };
83
84 /* crash-dump */
85@@ -839,6 +841,32 @@ wcid_to_mlink(struct mt76_wcid *wcid)
86 return container_of(wcid, struct mt7996_link_sta, wcid);
87 }
88
89+static inline struct mt76_wcid *
90+mt7996_get_link_wcid(struct mt7996_dev *dev, u16 idx, u8 band_idx)
91+{
92+ struct mt7996_link_sta *mlink;
93+ struct mt76_wcid *wcid;
94+ u8 link_id;
95+
96+ if (!idx || idx >= ARRAY_SIZE(dev->mt76.wcid))
97+ return NULL;
98+
99+ wcid = rcu_dereference(dev->mt76.wcid[idx]);
100+ if (!wcid)
101+ return NULL;
102+
103+ if (wcid->phy_idx == band_idx)
104+ return wcid;
105+
106+ mlink = wcid_to_mlink(wcid);
107+ link_id = mlink->sta->vif->band_to_link[band_idx];
108+ mlink = rcu_dereference(mlink->sta->link[link_id]);
109+ if (!mlink)
110+ return wcid;
111+
112+ return &mlink->wcid;
113+}
114+
115 extern const struct ieee80211_ops mt7996_ops;
116 extern struct pci_driver mt7996_pci_driver;
117 extern struct pci_driver mt7996_hif_driver;
118--
1192.39.2
120