Skip to content

Commit 0762bdd

Browse files
LorenzoBianconinbd168
authored andcommitted
wifi: mt76: mt7996: rework mt7996_mac_sta_rc_work to support MLO
Rework mt7996_mac_sta_rc_work routine in order to support multi-link setup. Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com> Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> Co-developed-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/20250312-b4-mt7996-mlo-p2-v1-12-015b3d6fd928@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 601e4ad commit 0762bdd

File tree

2 files changed

+52
-18
lines changed

2 files changed

+52
-18
lines changed

drivers/net/wireless/mediatek/mt76/mt7996/mac.c

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,13 +2300,20 @@ void mt7996_mac_update_stats(struct mt7996_phy *phy)
23002300
void mt7996_mac_sta_rc_work(struct work_struct *work)
23012301
{
23022302
struct mt7996_dev *dev = container_of(work, struct mt7996_dev, rc_work);
2303+
struct ieee80211_bss_conf *link_conf;
2304+
struct ieee80211_link_sta *link_sta;
23032305
struct mt7996_sta_link *msta_link;
2306+
struct mt7996_vif_link *link;
2307+
struct mt76_vif_link *mlink;
23042308
struct ieee80211_sta *sta;
23052309
struct ieee80211_vif *vif;
23062310
struct mt7996_sta *msta;
2307-
u32 changed;
2311+
struct mt7996_vif *mvif;
23082312
LIST_HEAD(list);
2313+
u32 changed;
2314+
u8 link_id;
23092315

2316+
rcu_read_lock();
23102317
spin_lock_bh(&dev->mt76.sta_poll_lock);
23112318
list_splice_init(&dev->sta_rc_list, &list);
23122319

@@ -2319,28 +2326,43 @@ void mt7996_mac_sta_rc_work(struct work_struct *work)
23192326
msta_link->changed = 0;
23202327
spin_unlock_bh(&dev->mt76.sta_poll_lock);
23212328

2329+
sta = wcid_to_sta(&msta_link->wcid);
2330+
link_id = msta_link->wcid.link_id;
23222331
msta = msta_link->sta;
2323-
sta = container_of((void *)msta, struct ieee80211_sta, drv_priv);
2324-
vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
2332+
mvif = msta->vif;
2333+
vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
2334+
2335+
mlink = rcu_dereference(mvif->mt76.link[link_id]);
2336+
if (!mlink)
2337+
continue;
2338+
2339+
link_sta = rcu_dereference(sta->link[link_id]);
2340+
if (!link_sta)
2341+
continue;
2342+
2343+
link_conf = rcu_dereference(vif->link_conf[link_id]);
2344+
if (!link_conf)
2345+
continue;
2346+
2347+
link = (struct mt7996_vif_link *)mlink;
23252348

23262349
if (changed & (IEEE80211_RC_SUPP_RATES_CHANGED |
23272350
IEEE80211_RC_NSS_CHANGED |
23282351
IEEE80211_RC_BW_CHANGED))
2329-
mt7996_mcu_add_rate_ctrl(dev, vif, &vif->bss_conf,
2330-
&sta->deflink,
2331-
&msta->vif->deflink,
2332-
msta_link, true);
2352+
mt7996_mcu_add_rate_ctrl(dev, vif, link_conf,
2353+
link_sta, link, msta_link,
2354+
true);
23332355

23342356
if (changed & IEEE80211_RC_SMPS_CHANGED)
2335-
mt7996_mcu_set_fixed_field(dev, &sta->deflink,
2336-
&msta->vif->deflink,
2357+
mt7996_mcu_set_fixed_field(dev, link_sta, link,
23372358
msta_link, NULL,
23382359
RATE_PARAM_MMPS_UPDATE);
23392360

23402361
spin_lock_bh(&dev->mt76.sta_poll_lock);
23412362
}
23422363

23432364
spin_unlock_bh(&dev->mt76.sta_poll_lock);
2365+
rcu_read_unlock();
23442366
}
23452367

23462368
void mt7996_mac_work(struct work_struct *work)

drivers/net/wireless/mediatek/mt76/mt7996/main.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ int mt7996_vif_link_add(struct mt76_phy *mphy, struct ieee80211_vif *vif,
304304

305305
INIT_LIST_HEAD(&msta_link->rc_list);
306306
msta_link->wcid.idx = idx;
307+
msta_link->wcid.link_id = link_conf->link_id;
307308
msta_link->wcid.tx_info |= MT_WCID_TX_INFO_SET;
308309
mt76_wcid_init(&msta_link->wcid, band_idx);
309310

@@ -1521,29 +1522,39 @@ static void mt7996_sta_statistics(struct ieee80211_hw *hw,
15211522
}
15221523
}
15231524

1524-
static void mt7996_sta_rc_work(void *data, struct ieee80211_sta *sta)
1525+
static void mt7996_link_rate_ctrl_update(void *data, struct ieee80211_sta *sta)
15251526
{
15261527
struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
15271528
struct mt7996_dev *dev = msta->vif->deflink.phy->dev;
1528-
struct mt7996_sta_link *msta_link = &msta->deflink;
1529+
struct mt7996_sta_link *msta_link;
15291530
u32 *changed = data;
15301531

1532+
rcu_read_lock();
1533+
1534+
msta_link = rcu_dereference(msta->link[msta->deflink_id]);
1535+
if (!msta_link)
1536+
goto out;
1537+
15311538
spin_lock_bh(&dev->mt76.sta_poll_lock);
1539+
15321540
msta_link->changed |= *changed;
15331541
if (list_empty(&msta_link->rc_list))
15341542
list_add_tail(&msta_link->rc_list, &dev->sta_rc_list);
1543+
15351544
spin_unlock_bh(&dev->mt76.sta_poll_lock);
1545+
out:
1546+
rcu_read_unlock();
15361547
}
15371548

1538-
static void mt7996_sta_rc_update(struct ieee80211_hw *hw,
1539-
struct ieee80211_vif *vif,
1540-
struct ieee80211_link_sta *link_sta,
1541-
u32 changed)
1549+
static void mt7996_link_sta_rc_update(struct ieee80211_hw *hw,
1550+
struct ieee80211_vif *vif,
1551+
struct ieee80211_link_sta *link_sta,
1552+
u32 changed)
15421553
{
15431554
struct mt7996_dev *dev = mt7996_hw_dev(hw);
15441555
struct ieee80211_sta *sta = link_sta->sta;
15451556

1546-
mt7996_sta_rc_work(&changed, sta);
1557+
mt7996_link_rate_ctrl_update(&changed, sta);
15471558
ieee80211_queue_work(hw, &dev->rc_work);
15481559
}
15491560

@@ -1565,7 +1576,8 @@ mt7996_set_bitrate_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
15651576
* - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT
15661577
* then multiple MCS setting (MCS 4,5,6) is not supported.
15671578
*/
1568-
ieee80211_iterate_stations_atomic(hw, mt7996_sta_rc_work, &changed);
1579+
ieee80211_iterate_stations_atomic(hw, mt7996_link_rate_ctrl_update,
1580+
&changed);
15691581
ieee80211_queue_work(hw, &dev->rc_work);
15701582

15711583
return 0;
@@ -2023,7 +2035,7 @@ const struct ieee80211_ops mt7996_ops = {
20232035
.link_info_changed = mt7996_link_info_changed,
20242036
.sta_state = mt7996_sta_state,
20252037
.sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
2026-
.link_sta_rc_update = mt7996_sta_rc_update,
2038+
.link_sta_rc_update = mt7996_link_sta_rc_update,
20272039
.set_key = mt7996_set_key,
20282040
.ampdu_action = mt7996_ampdu_action,
20292041
.set_rts_threshold = mt7996_set_rts_threshold,

0 commit comments

Comments
 (0)