]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: Update secondary link PS flow
authorMing Yen Hsieh <mingyen.hsieh@mediatek.com>
Wed, 11 Dec 2024 01:19:22 +0000 (17:19 -0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 14 Jan 2025 12:34:35 +0000 (13:34 +0100)
Update the power-saving flow for secondary links.

Fixes: 86c051f2c418 ("wifi: mt76: mt7925: enabling MLO when the firmware supports it")
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20241211011926.5002-13-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7925/main.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.h
drivers/net/wireless/mediatek/mt76/mt792x.h

index a78aae7d108868a3ed2e36f3a4c8043c2f2104b4..dcdb9bcff3c40e605129724c6ad472220e8e3fa6 100644 (file)
@@ -1903,6 +1903,13 @@ static void mt7925_link_info_changed(struct ieee80211_hw *hw,
        if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
                mt7925_mcu_set_tx(dev, info);
 
+       if (changed & BSS_CHANGED_BSSID) {
+               if (ieee80211_vif_is_mld(vif) &&
+                   hweight16(mvif->valid_links) == 2)
+                       /* Indicate the secondary setup done */
+                       mt7925_mcu_uni_bss_bcnft(dev, info, true);
+       }
+
        mt792x_mutex_release(dev);
 }
 
index 4577e838f5872a28b96e84d96d1eb87b86cd43fb..0976f3dffbe4624d1d58acbf8d72682b7e36715a 100644 (file)
@@ -1362,7 +1362,7 @@ int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev,
                                 &ps_req, sizeof(ps_req), true);
 }
 
-static int
+int
 mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
                         struct ieee80211_bss_conf *link_conf, bool enable)
 {
@@ -1923,32 +1923,21 @@ int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
 {
 #define MT7925_FIF_BIT_CLR             BIT(1)
 #define MT7925_FIF_BIT_SET             BIT(0)
-       struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
-       unsigned long valid = ieee80211_vif_is_mld(vif) ?
-                                     mvif->valid_links : BIT(0);
-       struct ieee80211_bss_conf *bss_conf;
        int err = 0;
-       int i;
 
        if (enable) {
-               for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
-                       bss_conf = mt792x_vif_to_bss_conf(vif, i);
-                       err = mt7925_mcu_uni_bss_bcnft(dev, bss_conf, true);
-                       if (err < 0)
-                               return err;
-               }
+               err = mt7925_mcu_uni_bss_bcnft(dev, &vif->bss_conf, true);
+               if (err < 0)
+                       return err;
 
                return mt7925_mcu_set_rxfilter(dev, 0,
                                               MT7925_FIF_BIT_SET,
                                               MT_WF_RFCR_DROP_OTHER_BEACON);
        }
 
-       for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
-               bss_conf = mt792x_vif_to_bss_conf(vif, i);
-               err = mt7925_mcu_set_bss_pm(dev, bss_conf, false);
-               if (err)
-                       return err;
-       }
+       err = mt7925_mcu_set_bss_pm(dev, &vif->bss_conf, false);
+       if (err < 0)
+               return err;
 
        return mt7925_mcu_set_rxfilter(dev, 0,
                                       MT7925_FIF_BIT_CLR,
index ac53bdc993322f520d89932e73b548417eac261a..31bb8ed2ec5133fe74e0be164f777b8108467cf4 100644 (file)
@@ -643,4 +643,7 @@ int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
 int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy);
 int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
                                 struct ieee80211_bss_conf *link_conf);
+int
+mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
+                        struct ieee80211_bss_conf *link_conf, bool enable);
 #endif
index 10e1eaa5270602613e194a4c6d6eeac2c4e0f1cd..cd497491cfc11f239ae2949ba1e9e67209787cca 100644 (file)
@@ -243,6 +243,7 @@ static inline struct mt792x_bss_conf *
 mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
 {
        struct ieee80211_vif *vif;
+       struct mt792x_bss_conf *bss_conf;
 
        vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
 
@@ -250,8 +251,10 @@ mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
            link_id >= IEEE80211_LINK_UNSPECIFIED)
                return &mvif->bss_conf;
 
-       return rcu_dereference_protected(mvif->link_conf[link_id],
-               lockdep_is_held(&mvif->phy->dev->mt76.mutex));
+       bss_conf = rcu_dereference_protected(mvif->link_conf[link_id],
+                                            lockdep_is_held(&mvif->phy->dev->mt76.mutex));
+
+       return bss_conf ? bss_conf : &mvif->bss_conf;
 }
 
 static inline struct mt792x_link_sta *