developer | 617abbd | 2024-04-23 14:50:01 +0800 | [diff] [blame^] | 1 | From 1f35388fa6214a36e5f7a4770c248a187a543019 Mon Sep 17 00:00:00 2001 |
| 2 | From: Shayne Chen <shayne.chen@mediatek.com> |
| 3 | Date: Mon, 4 Dec 2023 11:57:38 +0800 |
| 4 | Subject: [PATCH 095/116] wifi: mt76: mt7996: rework TXS for multi-link support |
| 5 | |
| 6 | This is a preliminary patch to add MLO support for mt7996 chipsets. |
| 7 | |
| 8 | Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com> |
| 9 | Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> |
| 10 | Signed-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 | |
| 17 | diff --git a/mt7996/mac.c b/mt7996/mac.c |
| 18 | index 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); |
| 60 | diff --git a/mt7996/main.c b/mt7996/main.c |
| 61 | index 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; |
| 72 | diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h |
| 73 | index 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 | -- |
| 119 | 2.39.2 |
| 120 | |