blob: 7ac5c7463bad757d26ac6e1431b87bf79f6bab75 [file] [log] [blame]
From f31a6d71ce640b43de1399d4a79dc0132b32b87b Mon Sep 17 00:00:00 2001
From: Shayne Chen <shayne.chen@mediatek.com>
Date: Mon, 4 Dec 2023 11:57:38 +0800
Subject: [PATCH 110/120] wifi: mt76: mt7996: rework TXS for multi-link support
This is a preliminary patch to add MLO support for mt7996 chipsets.
Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com>
Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
---
mt7996/mac.c | 9 +++++----
mt7996/main.c | 1 +
mt7996/mt7996.h | 28 ++++++++++++++++++++++++++++
3 files changed, 34 insertions(+), 4 deletions(-)
diff --git a/mt7996/mac.c b/mt7996/mac.c
index f6f028824..700029b04 100644
--- a/mt7996/mac.c
+++ b/mt7996/mac.c
@@ -1192,7 +1192,7 @@ mt7996_mac_add_txs_skb(struct mt7996_dev *dev, struct mt76_wcid *wcid,
struct ieee80211_sta *sta;
u8 tid;
- sta = container_of((void *)wcid, struct ieee80211_sta, drv_priv);
+ sta = wcid_to_sta(wcid);
tid = FIELD_GET(MT_TXS0_TID, txs);
ieee80211_refresh_tx_agg_session_timer(sta, tid);
}
@@ -1310,9 +1310,10 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
struct mt76_wcid *wcid;
__le32 *txs_data = data;
u16 wcidx;
- u8 pid;
+ u8 band, pid;
wcidx = le32_get_bits(txs_data[2], MT_TXS2_WCID);
+ band = le32_get_bits(txs_data[2], MT_TXS2_BAND);
pid = le32_get_bits(txs_data[3], MT_TXS3_PID);
if (pid < MT_PACKET_ID_NO_SKB)
@@ -1323,7 +1324,7 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
rcu_read_lock();
- wcid = rcu_dereference(dev->mt76.wcid[wcidx]);
+ wcid = mt7996_get_link_wcid(dev, wcidx, band);
if (!wcid)
goto out;
@@ -1332,7 +1333,7 @@ static void mt7996_mac_add_txs(struct mt7996_dev *dev, void *data)
if (!wcid->sta)
goto out;
- mlink = container_of(wcid, struct mt7996_link_sta, wcid);
+ mlink = wcid_to_mlink(wcid);
spin_lock_bh(&dev->mt76.sta_poll_lock);
if (list_empty(&mlink->wcid.poll_list))
list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
diff --git a/mt7996/main.c b/mt7996/main.c
index f4488fdf7..03f23453d 100644
--- a/mt7996/main.c
+++ b/mt7996/main.c
@@ -2307,6 +2307,7 @@ mt7996_assign_vif_chanctx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
mconf = mconf_dereference_protected(mvif, link_id);
mconf->chanctx = ctx;
ctx->nbss_assigned++;
+ mvif->band_to_link[phy->mt76->band_idx] = link_id;
if (mt7996_hw_phy(hw) == phy)
mvif->master_link_id = link_id;
diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
index 664d6d2ec..62270101e 100644
--- a/mt7996/mt7996.h
+++ b/mt7996/mt7996.h
@@ -358,6 +358,8 @@ struct mt7996_vif {
u8 master_link_id;
u8 group_mld_id;
u8 mld_remap_id;
+
+ u8 band_to_link[__MT_MAX_BAND];
};
/* crash-dump */
@@ -835,6 +837,32 @@ wcid_to_mlink(struct mt76_wcid *wcid)
return container_of(wcid, struct mt7996_link_sta, wcid);
}
+static inline struct mt76_wcid *
+mt7996_get_link_wcid(struct mt7996_dev *dev, u16 idx, u8 band_idx)
+{
+ struct mt7996_link_sta *mlink;
+ struct mt76_wcid *wcid;
+ u8 link_id;
+
+ if (idx >= ARRAY_SIZE(dev->mt76.wcid))
+ return NULL;
+
+ wcid = rcu_dereference(dev->mt76.wcid[idx]);
+ if (!wcid)
+ return NULL;
+
+ if (wcid->phy_idx == band_idx)
+ return wcid;
+
+ mlink = wcid_to_mlink(wcid);
+ link_id = mlink->sta->vif->band_to_link[band_idx];
+ mlink = rcu_dereference(mlink->sta->link[link_id]);
+ if (!mlink)
+ return wcid;
+
+ return &mlink->wcid;
+}
+
extern const struct ieee80211_ops mt7996_ops;
extern struct pci_driver mt7996_pci_driver;
extern struct pci_driver mt7996_hif_driver;
--
2.39.2