mt76: mt7615: fix/rewrite the dfs state handling logic
authorFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 12:39:31 +0000 (13:39 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 3 Feb 2022 15:15:05 +0000 (16:15 +0100)
Copy the updated logic from mt7915 to to fix issues in handling DFS radar
detector states

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c

index a753c7476d318866363f5bab687eefdaa723abda..a06dcbb8c67361b61759818f3daa205d80a4731c 100644 (file)
@@ -552,7 +552,6 @@ void mt7615_init_device(struct mt7615_dev *dev)
        dev->pm.stats.last_wake_event = jiffies;
        dev->pm.stats.last_doze_event = jiffies;
        mt7615_cap_dbdc_disable(dev);
-       dev->phy.dfs_state = -1;
 
 #ifdef CONFIG_NL80211_TESTMODE
        dev->mt76.test_ops = &mt7615_testmode_ops;
index 2705141402c1815f9a43b1eeda9f0518f675bf3a..1b350cc1d631aecf31f435197f965a1db59de0a7 100644 (file)
@@ -2287,44 +2287,51 @@ mt7615_dfs_init_radar_specs(struct mt7615_phy *phy)
 
 int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy)
 {
-       struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
        struct mt7615_dev *dev = phy->dev;
        bool ext_phy = phy != &dev->phy;
+       enum mt76_dfs_state dfs_state, prev_state;
        int err;
 
        if (is_mt7663(&dev->mt76))
                return 0;
 
-       if (dev->mt76.region == NL80211_DFS_UNSET) {
-               phy->dfs_state = -1;
-               if (phy->rdd_state)
-                       goto stop;
+       prev_state = phy->mt76->dfs_state;
+       dfs_state = mt76_phy_dfs_state(phy->mt76);
 
+       if (prev_state == dfs_state)
                return 0;
-       }
 
-       if (test_bit(MT76_SCANNING, &phy->mt76->state))
-               return 0;
-
-       if (phy->dfs_state == chandef->chan->dfs_state)
-               return 0;
+       if (prev_state == MT_DFS_STATE_UNKNOWN)
+               mt7615_dfs_stop_radar_detector(phy);
 
-       err = mt7615_dfs_init_radar_specs(phy);
-       if (err < 0) {
-               phy->dfs_state = -1;
+       if (dfs_state == MT_DFS_STATE_DISABLED)
                goto stop;
-       }
 
-       phy->dfs_state = chandef->chan->dfs_state;
+       if (prev_state <= MT_DFS_STATE_DISABLED) {
+               err = mt7615_dfs_init_radar_specs(phy);
+               if (err < 0)
+                       return err;
+
+               err = mt7615_dfs_start_radar_detector(phy);
+               if (err < 0)
+                       return err;
 
-       if (chandef->chan->flags & IEEE80211_CHAN_RADAR) {
-               if (chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
-                       return mt7615_dfs_start_radar_detector(phy);
+               phy->mt76->dfs_state = MT_DFS_STATE_CAC;
+       }
+
+       if (dfs_state == MT_DFS_STATE_CAC)
+               return 0;
 
-               return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_CAC_END, ext_phy,
-                                              MT_RX_SEL0, 0);
+       err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_CAC_END,
+                                     ext_phy, MT_RX_SEL0, 0);
+       if (err < 0) {
+               phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN;
+               return err;
        }
 
+       phy->mt76->dfs_state = MT_DFS_STATE_ACTIVE;
+       return 0;
+
 stop:
        err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_NORMAL_START, ext_phy,
                                      MT_RX_SEL0, 0);
@@ -2332,6 +2339,8 @@ stop:
                return err;
 
        mt7615_dfs_stop_radar_detector(phy);
+       phy->mt76->dfs_state = MT_DFS_STATE_DISABLED;
+
        return 0;
 }