Hi Lorenzo, On Wed, 2025-03-12 at 12:14 +0100, Lorenzo Bianconi wrote: > > External email : Please do not click links or open attachments until > you have verified the sender or the content. > > > Active/de-active TX/RX BA sessssion for each active links running > mt7996_ampdu_action routine. > > Signed-off-by: Lorenzo Bianconi <lorenzo@xxxxxxxxxx> > --- > drivers/net/wireless/mediatek/mt76/mt7996/main.c | 89 > ++++++++++++++-------- > drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 16 ++-- > drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h | 5 +- > 3 files changed, 64 insertions(+), 46 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/main.c > b/drivers/net/wireless/mediatek/mt76/mt7996/main.c > index > 8bcb4b8e3ef58c23294c16c10d38384bfba87e30..adeb267b2801894590f90d02e90 > 2ebec602de98a 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7996/main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/main.c > @@ -1259,12 +1259,13 @@ mt7996_ampdu_action(struct ieee80211_hw *hw, > struct ieee80211_vif *vif, > enum ieee80211_ampdu_mlme_action action = params->action; > struct mt7996_dev *dev = mt7996_hw_dev(hw); > struct ieee80211_sta *sta = params->sta; > - struct ieee80211_txq *txq = sta->txq[params->tid]; > struct mt7996_sta *msta = (struct mt7996_sta *)sta->drv_priv; > - struct mt7996_sta_link *msta_link = &msta->deflink; > + struct ieee80211_txq *txq = sta->txq[params->tid]; > + struct ieee80211_link_sta *link_sta; > u16 tid = params->tid; > u16 ssn = params->ssn; > struct mt76_txq *mtxq; > + unsigned int link_id; > int ret = 0; > > if (!txq) > @@ -1274,38 +1275,60 @@ mt7996_ampdu_action(struct ieee80211_hw *hw, > struct ieee80211_vif *vif, > > mutex_lock(&dev->mt76.mutex); > > - switch (action) { > - case IEEE80211_AMPDU_RX_START: > - mt76_rx_aggr_start(&dev->mt76, &msta_link->wcid, tid, > ssn, > - params->buf_size); > - ret = mt7996_mcu_add_rx_ba(dev, params, true); > - break; > - case IEEE80211_AMPDU_RX_STOP: > - mt76_rx_aggr_stop(&dev->mt76, &msta_link->wcid, tid); > - ret = mt7996_mcu_add_rx_ba(dev, params, false); > - break; > - case IEEE80211_AMPDU_TX_OPERATIONAL: > - mtxq->aggr = true; > - mtxq->send_bar = false; > - ret = mt7996_mcu_add_tx_ba(dev, params, true); > - break; > - case IEEE80211_AMPDU_TX_STOP_FLUSH: > - case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: > - mtxq->aggr = false; > - clear_bit(tid, &msta_link->wcid.ampdu_state); > - ret = mt7996_mcu_add_tx_ba(dev, params, false); > - break; > - case IEEE80211_AMPDU_TX_START: > - set_bit(tid, &msta_link->wcid.ampdu_state); > - ret = IEEE80211_AMPDU_TX_START_IMMEDIATE; > - break; > - case IEEE80211_AMPDU_TX_STOP_CONT: > - mtxq->aggr = false; > - clear_bit(tid, &msta_link->wcid.ampdu_state); > - ret = mt7996_mcu_add_tx_ba(dev, params, false); > - ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); > - break; > + for_each_sta_active_link(vif, sta, link_sta, link_id) { > + struct mt7996_sta_link *msta_link; > + struct mt7996_vif_link *link; > + > + msta_link = mt76_dereference(msta->link[link_id], > &dev->mt76); > + if (!msta_link) > + continue; > + > + link = mt7996_vif_link(dev, vif, link_id); > + if (!link) > + continue; > + > + switch (action) { > + case IEEE80211_AMPDU_RX_START: > + mt76_rx_aggr_start(&dev->mt76, &msta_link- > >wcid, tid, > + ssn, params->buf_size); > + ret = mt7996_mcu_add_rx_ba(dev, params, link, > true); > + break; > + case IEEE80211_AMPDU_RX_STOP: > + mt76_rx_aggr_stop(&dev->mt76, &msta_link- > >wcid, tid); > + ret = mt7996_mcu_add_rx_ba(dev, params, link, > false); > + break; > + case IEEE80211_AMPDU_TX_OPERATIONAL: > + mtxq->aggr = true; > + mtxq->send_bar = false; > + ret = mt7996_mcu_add_tx_ba(dev, params, link, > + msta_link, true); > + break; > + case IEEE80211_AMPDU_TX_STOP_FLUSH: > + case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: > + mtxq->aggr = false; > + clear_bit(tid, &msta_link->wcid.ampdu_state); > + ret = mt7996_mcu_add_tx_ba(dev, params, link, > + msta_link, false); > + break; > + case IEEE80211_AMPDU_TX_START: > + set_bit(tid, &msta_link->wcid.ampdu_state); > + ret = IEEE80211_AMPDU_TX_START_IMMEDIATE; > + break; > + case IEEE80211_AMPDU_TX_STOP_CONT: > + mtxq->aggr = false; > + clear_bit(tid, &msta_link->wcid.ampdu_state); > + ret = mt7996_mcu_add_tx_ba(dev, params, link, > + msta_link, false); > + break; > + } > + > + if (ret) > + break; > } > + > + if (action == IEEE80211_AMPDU_TX_STOP_CONT) > + ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); > + > mutex_unlock(&dev->mt76.mutex); > > return ret; > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c > b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c > index > 85602a8594e0c9ab3a0055e04cf1ca836d62b6b9..89e4f0e8858322b636650a27d9a > b0872987b7011 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c > @@ -1160,26 +1160,20 @@ mt7996_mcu_sta_ba(struct mt7996_dev *dev, > struct mt76_vif_link *mvif, > /** starec & wtbl **/ > int mt7996_mcu_add_tx_ba(struct mt7996_dev *dev, > struct ieee80211_ampdu_params *params, > - bool enable) > + struct mt7996_vif_link *link, > + struct mt7996_sta_link *msta_link, bool > enable) > { > - struct mt7996_sta *msta = (struct mt7996_sta *)params->sta- > >drv_priv; > - struct mt7996_sta_link *msta_link = &msta->deflink; > - struct mt7996_vif *mvif = msta->vif; > - > if (enable && !params->amsdu) > msta_link->wcid.amsdu = false; > > - return mt7996_mcu_sta_ba(dev, &mvif->deflink.mt76, params, > enable, true); > + return mt7996_mcu_sta_ba(dev, &link->mt76, params, enable, > true); Per-link-bss setting is now ready for mt7996_mcu_sta_ba(), while for per-link-sta, the wcid is still retrieved from deflink through the following line: struct mt76_wcid *wcid = (struct mt76_wcid *)params->sta->drv_priv We may also need to pass msta_link->wcid to mt7996_mcu_sta_ba(). > } > > int mt7996_mcu_add_rx_ba(struct mt7996_dev *dev, > struct ieee80211_ampdu_params *params, > - bool enable) > + struct mt7996_vif_link *link, bool enable) > { > - struct mt7996_sta *msta = (struct mt7996_sta *)params->sta- > >drv_priv; > - struct mt7996_vif *mvif = msta->vif; > - > - return mt7996_mcu_sta_ba(dev, &mvif->deflink.mt76, params, > enable, false); > + return mt7996_mcu_sta_ba(dev, &link->mt76, params, enable, > false); Same here. > } > > static void > diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h > b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h > index > 815a3c68b8723469e32e74b85979eaf75c1b176a..43e646ed6094cb7fb78d201fc3e > e8446ad2a16a1 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h > +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h > @@ -584,10 +584,11 @@ int mt7996_mcu_teardown_mld_sta(struct > mt7996_dev *dev, > struct mt7996_sta_link *msta_link); > int mt7996_mcu_add_tx_ba(struct mt7996_dev *dev, > struct ieee80211_ampdu_params *params, > - bool add); > + struct mt7996_vif_link *link, > + struct mt7996_sta_link *msta_link, bool > enable); > int mt7996_mcu_add_rx_ba(struct mt7996_dev *dev, > struct ieee80211_ampdu_params *params, > - bool add); > + struct mt7996_vif_link *link, bool enable); > int mt7996_mcu_update_bss_color(struct mt7996_dev *dev, > struct mt76_vif_link *mlink, > struct cfg80211_he_bss_color > *he_bss_color); > > -- > 2.48.1 > Regards, Shayne