]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7996: rework mt7996_ampdu_action to support MLO
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 12 Mar 2025 11:14:04 +0000 (12:14 +0100)
committerFelix Fietkau <nbd@nbd.name>
Wed, 19 Mar 2025 13:47:07 +0000 (14:47 +0100)
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>
drivers/net/wireless/mediatek/mt76/mt7996/main.c
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h

index 8bcb4b8e3ef58c23294c16c10d38384bfba87e30..adeb267b2801894590f90d02e902ebec602de98a 100644 (file)
@@ -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;
index 4bd0c16500ab6f7c073ba26dc89cf25533792b5b..ddd555942c738912d79d7d633b4e8b2e3cdc5a42 100644 (file)
@@ -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);
 }
 
 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);
 }
 
 static void
index 815a3c68b8723469e32e74b85979eaf75c1b176a..43e646ed6094cb7fb78d201fc3ee8446ad2a16a1 100644 (file)
@@ -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);