Skip to content

Commit d57cfa2

Browse files
committed
wifi: mt76: mt7996: rework mt7996_ampdu_action to support MLO
JIRA: https://issues.redhat.com/browse/RHEL-89168 commit ef3f594 Author: Lorenzo Bianconi <lorenzo@kernel.org> Date: Wed Mar 12 12:14:04 2025 +0100 wifi: mt76: mt7996: rework mt7996_ampdu_action to support MLO Active/de-active TX/RX BA sessssion for each active links running mt7996_ampdu_action routine. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Link: https://patch.msgid.link/20250312-b4-mt7996-mlo-p2-v1-20-015b3d6fd928@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name> Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
1 parent afc59f0 commit d57cfa2

File tree

3 files changed

+64
-46
lines changed

3 files changed

+64
-46
lines changed

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

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,12 +1259,13 @@ mt7996_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
12591259
enum ieee80211_ampdu_mlme_action action = params->action;
12601260
struct mt7996_dev *dev = mt7996_hw_dev(hw);
12611261
struct ieee80211_sta *sta = params->sta;
1262-
struct ieee80211_txq *txq = sta->txq[params->tid];
12631262
struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv;
1264-
struct mt7996_sta_link *msta_link = &msta->deflink;
1263+
struct ieee80211_txq *txq = sta->txq[params->tid];
1264+
struct ieee80211_link_sta *link_sta;
12651265
u16 tid = params->tid;
12661266
u16 ssn = params->ssn;
12671267
struct mt76_txq *mtxq;
1268+
unsigned int link_id;
12681269
int ret = 0;
12691270

12701271
if (!txq)
@@ -1274,38 +1275,60 @@ mt7996_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
12741275

12751276
mutex_lock(&dev->mt76.mutex);
12761277

1277-
switch (action) {
1278-
case IEEE80211_AMPDU_RX_START:
1279-
mt76_rx_aggr_start(&dev->mt76, &msta_link->wcid, tid, ssn,
1280-
params->buf_size);
1281-
ret = mt7996_mcu_add_rx_ba(dev, params, true);
1282-
break;
1283-
case IEEE80211_AMPDU_RX_STOP:
1284-
mt76_rx_aggr_stop(&dev->mt76, &msta_link->wcid, tid);
1285-
ret = mt7996_mcu_add_rx_ba(dev, params, false);
1286-
break;
1287-
case IEEE80211_AMPDU_TX_OPERATIONAL:
1288-
mtxq->aggr = true;
1289-
mtxq->send_bar = false;
1290-
ret = mt7996_mcu_add_tx_ba(dev, params, true);
1291-
break;
1292-
case IEEE80211_AMPDU_TX_STOP_FLUSH:
1293-
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
1294-
mtxq->aggr = false;
1295-
clear_bit(tid, &msta_link->wcid.ampdu_state);
1296-
ret = mt7996_mcu_add_tx_ba(dev, params, false);
1297-
break;
1298-
case IEEE80211_AMPDU_TX_START:
1299-
set_bit(tid, &msta_link->wcid.ampdu_state);
1300-
ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
1301-
break;
1302-
case IEEE80211_AMPDU_TX_STOP_CONT:
1303-
mtxq->aggr = false;
1304-
clear_bit(tid, &msta_link->wcid.ampdu_state);
1305-
ret = mt7996_mcu_add_tx_ba(dev, params, false);
1306-
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1307-
break;
1278+
for_each_sta_active_link(vif, sta, link_sta, link_id) {
1279+
struct mt7996_sta_link *msta_link;
1280+
struct mt7996_vif_link *link;
1281+
1282+
msta_link = mt76_dereference(msta->link[link_id], &dev->mt76);
1283+
if (!msta_link)
1284+
continue;
1285+
1286+
link = mt7996_vif_link(dev, vif, link_id);
1287+
if (!link)
1288+
continue;
1289+
1290+
switch (action) {
1291+
case IEEE80211_AMPDU_RX_START:
1292+
mt76_rx_aggr_start(&dev->mt76, &msta_link->wcid, tid,
1293+
ssn, params->buf_size);
1294+
ret = mt7996_mcu_add_rx_ba(dev, params, link, true);
1295+
break;
1296+
case IEEE80211_AMPDU_RX_STOP:
1297+
mt76_rx_aggr_stop(&dev->mt76, &msta_link->wcid, tid);
1298+
ret = mt7996_mcu_add_rx_ba(dev, params, link, false);
1299+
break;
1300+
case IEEE80211_AMPDU_TX_OPERATIONAL:
1301+
mtxq->aggr = true;
1302+
mtxq->send_bar = false;
1303+
ret = mt7996_mcu_add_tx_ba(dev, params, link,
1304+
msta_link, true);
1305+
break;
1306+
case IEEE80211_AMPDU_TX_STOP_FLUSH:
1307+
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
1308+
mtxq->aggr = false;
1309+
clear_bit(tid, &msta_link->wcid.ampdu_state);
1310+
ret = mt7996_mcu_add_tx_ba(dev, params, link,
1311+
msta_link, false);
1312+
break;
1313+
case IEEE80211_AMPDU_TX_START:
1314+
set_bit(tid, &msta_link->wcid.ampdu_state);
1315+
ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
1316+
break;
1317+
case IEEE80211_AMPDU_TX_STOP_CONT:
1318+
mtxq->aggr = false;
1319+
clear_bit(tid, &msta_link->wcid.ampdu_state);
1320+
ret = mt7996_mcu_add_tx_ba(dev, params, link,
1321+
msta_link, false);
1322+
break;
1323+
}
1324+
1325+
if (ret)
1326+
break;
13081327
}
1328+
1329+
if (action == IEEE80211_AMPDU_TX_STOP_CONT)
1330+
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1331+
13091332
mutex_unlock(&dev->mt76.mutex);
13101333

13111334
return ret;

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

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,26 +1160,20 @@ mt7996_mcu_sta_ba(struct mt7996_dev *dev, struct mt76_vif_link *mvif,
11601160
/** starec & wtbl **/
11611161
int mt7996_mcu_add_tx_ba(struct mt7996_dev *dev,
11621162
struct ieee80211_ampdu_params *params,
1163-
bool enable)
1163+
struct mt7996_vif_link *link,
1164+
struct mt7996_sta_link *msta_link, bool enable)
11641165
{
1165-
struct mt7996_sta *msta = (struct mt7996_sta *)params->sta->drv_priv;
1166-
struct mt7996_sta_link *msta_link = &msta->deflink;
1167-
struct mt7996_vif *mvif = msta->vif;
1168-
11691166
if (enable && !params->amsdu)
11701167
msta_link->wcid.amsdu = false;
11711168

1172-
return mt7996_mcu_sta_ba(dev, &mvif->deflink.mt76, params, enable, true);
1169+
return mt7996_mcu_sta_ba(dev, &link->mt76, params, enable, true);
11731170
}
11741171

11751172
int mt7996_mcu_add_rx_ba(struct mt7996_dev *dev,
11761173
struct ieee80211_ampdu_params *params,
1177-
bool enable)
1174+
struct mt7996_vif_link *link, bool enable)
11781175
{
1179-
struct mt7996_sta *msta = (struct mt7996_sta *)params->sta->drv_priv;
1180-
struct mt7996_vif *mvif = msta->vif;
1181-
1182-
return mt7996_mcu_sta_ba(dev, &mvif->deflink.mt76, params, enable, false);
1176+
return mt7996_mcu_sta_ba(dev, &link->mt76, params, enable, false);
11831177
}
11841178

11851179
static void

drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -584,10 +584,11 @@ int mt7996_mcu_teardown_mld_sta(struct mt7996_dev *dev,
584584
struct mt7996_sta_link *msta_link);
585585
int mt7996_mcu_add_tx_ba(struct mt7996_dev *dev,
586586
struct ieee80211_ampdu_params *params,
587-
bool add);
587+
struct mt7996_vif_link *link,
588+
struct mt7996_sta_link *msta_link, bool enable);
588589
int mt7996_mcu_add_rx_ba(struct mt7996_dev *dev,
589590
struct ieee80211_ampdu_params *params,
590-
bool add);
591+
struct mt7996_vif_link *link, bool enable);
591592
int mt7996_mcu_update_bss_color(struct mt7996_dev *dev,
592593
struct mt76_vif_link *mlink,
593594
struct cfg80211_he_bss_color *he_bss_color);

0 commit comments

Comments
 (0)