mt76: mt7921: enable HW beacon filter in the initialization stage
authorSean Wang <sean.wang@mediatek.com>
Tue, 21 Jun 2022 21:17:39 +0000 (05:17 +0800)
committerFelix Fietkau <nbd@nbd.name>
Mon, 11 Jul 2022 11:40:03 +0000 (13:40 +0200)
The current driver has worked with HW beacon filter and connection
monitor all the way, here we move the enablement into the initialization
stage like other HW features being done to get rid of others are
confused why these configurations would be changed at runtime.

We still leave a way to turn off these offload features in debugfs knobs
but that is just for debugging purposes.

Tested-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/init.c
drivers/net/wireless/mediatek/mt76/mt7921/main.c
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c

index af594b10f47f6a47e8422275addf6396b2d7d25c..cd960e23770ff711c7cb5590c82b0e8d2aea7053 100644 (file)
@@ -97,6 +97,7 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
        ieee80211_hw_set(hw, SUPPORTS_PS);
        ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
        ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW);
+       ieee80211_hw_set(hw, CONNECTION_MONITOR);
 
        if (dev->pm.enable)
                ieee80211_hw_set(hw, CONNECTION_MONITOR);
index 2ea20e9306fde177b24f801125c41b4142b6ead9..6891d655ab93a2b68b6b5cc55b2ed58d53058960 100644 (file)
@@ -352,6 +352,7 @@ static int mt7921_add_interface(struct ieee80211_hw *hw,
                mtxq->wcid = idx;
        }
 
+       vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
 out:
        mt7921_mutex_release(dev);
 
@@ -495,8 +496,21 @@ static void
 mt7921_pm_interface_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
 {
        struct mt7921_dev *dev = priv;
+       struct ieee80211_hw *hw = mt76_hw(dev);
+       bool pm_enable = dev->pm.enable;
+       int err;
 
-       mt7921_mcu_set_beacon_filter(dev, vif, dev->pm.enable);
+       err = mt7921_mcu_set_beacon_filter(dev, vif, pm_enable);
+       if (err < 0)
+               return;
+
+       if (pm_enable) {
+               vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
+               ieee80211_hw_set(hw, CONNECTION_MONITOR);
+       } else {
+               vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
+               __clear_bit(IEEE80211_HW_CONNECTION_MONITOR, hw->flags);
+       }
 }
 
 static void
index c232319d2071d49389aa834074a773c003dfa693..6139ba63f6092b33e4f241ae3f0f1db5098369b6 100644 (file)
@@ -779,7 +779,6 @@ int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev,
                                 struct ieee80211_vif *vif,
                                 bool enable)
 {
-       struct ieee80211_hw *hw = mt76_hw(dev);
        int err;
 
        if (enable) {
@@ -787,8 +786,6 @@ int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev,
                if (err)
                        return err;
 
-               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);
 
                return 0;
@@ -798,8 +795,6 @@ int mt7921_mcu_set_beacon_filter(struct mt7921_dev *dev,
        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;