@@ -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 ;
0 commit comments