mt76: mt7921: introduce mt7921_mcu_set_beacon_filter utility routine
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 9 Aug 2021 10:37:22 +0000 (12:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Jul 2022 14:34:53 +0000 (16:34 +0200)
[ Upstream commit 890809ca1986e63d29dd1591090af67b655ed89c ]

Introduce mt7921_mcu_set_beacon_filter utility routine in order to
remove duplicated code for hw beacon filtering.
Move mt7921_pm_interface_iter in debugfs since it is just used there.
Make the following routine static:
- mt7921_pm_interface_iter
- mt7921_mcu_uni_bss_bcnft
- mt7921_mcu_set_bss_pm

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7921/main.c
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h

index 8d5e261..82fb258 100644 (file)
@@ -262,30 +262,38 @@ mt7921_txpwr(struct seq_file *s, void *data)
        return 0;
 }
 
+static void
+mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
+{
+       struct mt7921_dev *dev = priv;
+
+       mt7921_mcu_set_beacon_filter(dev, vif, dev->pm.enable);
+}
+
 static int
 mt7921_pm_set(void *data, u64 val)
 {
        struct mt7921_dev *dev = data;
        struct mt76_connac_pm *pm = &dev->pm;
-       struct mt76_phy *mphy = dev->phy.mt76;
-
-       if (val == pm->enable)
-               return 0;
 
        mt7921_mutex_acquire(dev);
 
+       if (val == pm->enable)
+               goto out;
+
        if (!pm->enable) {
                pm->stats.last_wake_event = jiffies;
                pm->stats.last_doze_event = jiffies;
        }
        pm->enable = val;
 
-       ieee80211_iterate_active_interfaces(mphy->hw,
+       ieee80211_iterate_active_interfaces(mt76_hw(dev),
                                            IEEE80211_IFACE_ITER_RESUME_ALL,
-                                           mt7921_pm_interface_iter, mphy->priv);
+                                           mt7921_pm_interface_iter, dev);
 
        mt76_connac_mcu_set_deep_sleep(&dev->mt76, pm->ds_enable);
 
+out:
        mt7921_mutex_release(dev);
 
        return 0;
index 30252f4..13a7ae3 100644 (file)
@@ -528,36 +528,6 @@ static void mt7921_configure_filter(struct ieee80211_hw *hw,
        mt7921_mutex_release(dev);
 }
 
-static int
-mt7921_bss_bcnft_apply(struct mt7921_dev *dev, struct ieee80211_vif *vif,
-                      bool assoc)
-{
-       int ret;
-
-       if (!dev->pm.enable)
-               return 0;
-
-       if (assoc) {
-               ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
-               if (ret)
-                       return ret;
-
-               vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
-               mt76_set(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON);
-
-               return 0;
-       }
-
-       ret = mt7921_mcu_set_bss_pm(dev, vif, false);
-       if (ret)
-               return ret;
-
-       vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
-       mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON);
-
-       return 0;
-}
-
 static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
                                    struct ieee80211_vif *vif,
                                    struct ieee80211_bss_conf *info,
@@ -587,7 +557,8 @@ static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
        if (changed & BSS_CHANGED_ASSOC) {
                mt7921_mcu_sta_update(dev, NULL, vif, true,
                                      MT76_STA_INFO_STATE_ASSOC);
-               mt7921_bss_bcnft_apply(dev, vif, info->assoc);
+               if (dev->pm.enable)
+                       mt7921_mcu_set_beacon_filter(dev, vif, info->assoc);
        }
 
        if (changed & BSS_CHANGED_ARP_FILTER) {
index 4119f8e..dabc0de 100644 (file)
@@ -1205,8 +1205,9 @@ int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif)
                                 &ps_req, sizeof(ps_req), true);
 }
 
-int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
-                            bool enable)
+static int
+mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                        bool enable)
 {
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
        struct {
@@ -1240,8 +1241,9 @@ int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
                                 &bcnft_req, sizeof(bcnft_req), true);
 }
 
-int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
-                         bool enable)
+static int
+mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                     bool enable)
 {
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
        struct {
@@ -1390,31 +1392,34 @@ out:
        return err;
 }
 
-void
-mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
+int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev,
+                                struct ieee80211_vif *vif,
+                                bool enable)
 {
-       struct mt7921_phy *phy = priv;
-       struct mt7921_dev *dev = phy->dev;
        struct ieee80211_hw *hw = mt76_hw(dev);
-       int ret;
-
-       if (dev->pm.enable)
-               ret = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
-       else
-               ret = mt7921_mcu_set_bss_pm(dev, vif, false);
+       int err;
 
-       if (ret)
-               return;
+       if (enable) {
+               err = mt7921_mcu_uni_bss_bcnft(dev, vif, true);
+               if (err)
+                       return err;
 
-       if (dev->pm.enable) {
                vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
                ieee80211_hw_set(hw, CONNECTION_MONITOR);
                mt76_set(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON);
-       } else {
-               vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
-               __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags);
-               mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON);
+
+               return 0;
        }
+
+       err = mt7921_mcu_set_bss_pm(dev, vif, false);
+       if (err)
+               return err;
+
+       vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
+       __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags);
+       mt76_clear(dev, MT_WF_RFCR(0), MT_WF_RFCR_DROP_OTHER_BEACON);
+
+       return 0;
 }
 
 int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr)
index 1aafd87..32d4f2c 100644 (file)
@@ -363,6 +363,9 @@ void mt7921_set_stream_he_caps(struct mt7921_phy *phy);
 void mt7921_update_channel(struct mt76_phy *mphy);
 int mt7921_init_debugfs(struct mt7921_dev *dev);
 
+int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev,
+                                struct ieee80211_vif *vif,
+                                bool enable);
 int mt7921_mcu_uni_tx_ba(struct mt7921_dev *dev,
                         struct ieee80211_ampdu_params *params,
                         bool enable);
@@ -371,17 +374,12 @@ int mt7921_mcu_uni_rx_ba(struct mt7921_dev *dev,
                         bool enable);
 void mt7921_scan_work(struct work_struct *work);
 int mt7921_mcu_uni_bss_ps(struct mt7921_dev *dev, struct ieee80211_vif *vif);
-int mt7921_mcu_uni_bss_bcnft(struct mt7921_dev *dev, struct ieee80211_vif *vif,
-                            bool enable);
-int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
-                         bool enable);
 int __mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev);
 int mt7921_mcu_drv_pmctrl(struct mt7921_dev *dev);
 int mt7921_mcu_fw_pmctrl(struct mt7921_dev *dev);
 void mt7921_pm_wake_work(struct work_struct *work);
 void mt7921_pm_power_save_work(struct work_struct *work);
 bool mt7921_wait_for_mcu_init(struct mt7921_dev *dev);
-void mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif);
 void mt7921_coredump_work(struct work_struct *work);
 int mt7921_wfsys_reset(struct mt7921_dev *dev);
 int mt7921_get_txpwr_info(struct mt7921_dev *dev, struct mt7921_txpwr *txpwr);